我有一行代码非常有用:
void *test;
/*...*/
test = &va_arg(arg_list, int);
我只是尝试这个,正如我想的那样,这是一个宏而不是一个函数,所以它可能会起作用。 我并没有真正期待它能够发挥作用,但它完全符合我的要求。
但是现在我不确定地址的有效期以及这种风格可能带来的其他风险。
有人能告诉我为什么这样使用va_arg
的值的引用是安全/不安全的吗?
答案 0 :(得分:3)
C99标准,第7.15.1.1节(强调我的):
va_arg宏扩展为具有指定值的表达式 类型和调用中下一个参数的值。
这意味着va_arg
不一定要评估左值;取其扩展的地址是不安全的:左值可以用作表达式,但不是每个表达式都是左值。考虑表达式3+4
。采取那个地址是没有意义的。
所以,不,你不应该这样做。
UPDATE:正如评论中所指出的,获取非左值的表达式的地址将导致编译错误。因此,如果代码编译,那么它应该是安全的。不可移植性问题源于这样一个事实:它可能无法在va_arg()
扩展到非左值的其他平台上编译。