c - 通过引用访问 va_arg 宏是错误的风格还是不正确的?

标签 c reference variadic-functions

我得到了一行非常有用的代码:

void *test;
/*...*/
test = &va_arg(arg_list, int);

我只是在尝试这个,正如我所想的那样,这是一个宏而不是一个函数,所以它可能会起作用。 我真的没想到它会起作用,但它完全符合我的要求。

但现在我不确定地址的生命周期以及这种样式可能发生的其他风险。

谁能告诉我为什么以这种方式使用 va_arg 的值的引用是安全的/不安全的?

最佳答案

C99 标准,第 7.15.1.1 节(强调我的):

The va_arg macro expands to an expression that has the specified type and the value of the next argument in the call.

这意味着 va_arg 不一定计算为左值;获取它扩展到的地址是不安全的:左值可以用作表达式,但并非每个表达式都是左值。考虑表达式 3+4。获取它的地址没有意义。

所以,不,你不应该这样做。

更新:正如评论中所指出的,获取非左值表达式的地址将导致编译错误。所以,如果代码编译通过,那么它应该是安全的。不可移植性问题是因为它可能无法在 va_arg() 扩展为非左值的其他平台上编译。

关于c - 通过引用访问 va_arg 宏是错误的风格还是不正确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24199511/

相关文章:

c - 在 C 语言中将参数传递给函数时的隐式转换

c# - 获取引用项目的程序集名称

c++ - 删除数组指针

python - 如何通过 njit 函数中的引用来修改类属性?

c - 复制文件时出现段错误

c - 阅读直到我设法输入一个整数

c++ - 避免函数重载

objective-c - 什么时候在 Objective-C 方法中使用可变参数是合适的?

c++ - 正确声明模板参数 - 显式特化函数定义时的参数

c - 为什么gcc编译出来的exe文件这么大?