通过引用访问va_arg宏是不好的样式还是不正确?

时间:2014-06-13 07:04:05

标签: c reference variadic-functions

我有一行代码非常有用:

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

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

但是现在我不确定地址的有效期以及这种风格可能带来的其他风险。

有人能告诉我为什么这样使用va_arg的值的引用是安全/不安全的吗?

1 个答案:

答案 0 :(得分:3)

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

  

va_arg宏扩展为具有指定值的表达式   类型和调用中下一个参数的值。

这意味着va_arg不一定要评估左值;取其扩展的地址是不安全的:左值可以用作表达式,但不是每个表达式都是左值。考虑表达式3+4。采取那个地址是没有意义的。

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

UPDATE:正如评论中所指出的,获取非左值的表达式的地址将导致编译错误。因此,如果代码编译,那么它应该是安全的。不可移植性问题源于这样一个事实:它可能无法在va_arg()扩展到非左值的其他平台上编译。