我得到了一行非常有用的代码:
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/