首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用null指针终止变量参数列表

使用null指针终止变量参数列表
EN

Stack Overflow用户
提问于 2015-12-23 19:48:39
回答 3查看 827关注 0票数 1

我们有很多遗留的C++代码,它们的函数接受数量可变的指针参数。在每种情况下,空指针都表示参数列表的结束。在遗留代码中,文字0用于空指针。由于C++变量参数列表函数不会原型化变量参数的类型,因此终止参数将作为整数0传递。在某些64位环境中,整数是32位的,而指针是64位的。是否存在被调用函数看到非零指针的风险(例如,低位32位字是零,但高位32位包含垃圾)?将所有0参数更改为nullptr可能是正确的方法。我的问题是:这是必要的吗?也就是说,如果我们不这样做,是否真的有出错的风险?

代码语言:javascript
复制
class mytype;  
void foo(mytype*, ...); 

mytype a, b, c;
foo(&a, &b, &c, 0);  //is this ok ?
foo(&a, &b, &c, nullptr); //or must it be so ?
EN

回答 3

Stack Overflow用户

发布于 2015-12-23 19:55:34

你误导了你的用户。如果每个参数都被解包为va_arg(ap, mytype*),那么用户应该使用(mytype*)(0)而不是0来表示列表的结束。您现有的代码总是具有未定义的行为。即使是nullptr也不合适,因为当它是无类型参数时,它将被作为void*传递,所以同样正确的参数是static_cast<mytype*>(nullptr)

如果您要求对您的未定义行为进行特定于平台的制裁,请咨询您的供应商。

票数 3
EN

Stack Overflow用户

发布于 2017-09-14 18:49:56

一个(部分)解决方案是使用运算符重载:

代码语言:javascript
复制
void saferfoo(mytype* a0, mytype* a1, ..., mytype* an, int zero) {
   foo(a0, a1, ..., an, static_cast<mytype*>(nullptr));
}

这里的...不是来自于C++语言的省略,而是来自我们人类语言的省略。

您必须为代码中存在的每个参数定义函数,还必须重新编译相关代码。由于受影响的只是过去/现在对foo的滥用,因此您可以这样做,并使用棒球棒来处理将来对foo的滥用。

票数 0
EN

Stack Overflow用户

发布于 2015-12-23 19:56:46

在我看来,使用0是一种不可移植的解决方案。根据编译器的不同,它可以转换为数组元素的数据类型,也可以转换为int(0)。

因此,我个人建议在这种情况下始终使用NULL。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34435048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档