dhe*_*ein 5 c reference variadic-functions
我得到了一行代码,这非常有用:
void *test;
/*...*/
test = &va_arg(arg_list, int);
Run Code Online (Sandbox Code Playgroud)
我只是尝试这个,正如我想的那样,这是一个宏而不是一个函数,所以它可能会起作用.我并没有真正期待它能够发挥作用,但它完全符合我的要求.
但是现在我不确定这种风格可能发生的地址的生命周期和其他风险.
谁能告诉我为什么使用va_arg这种方式的参考是安全/不安全的?
C99 标准,第 7.15.1.1 节(重点是我的):
va_arg 宏扩展为具有指定类型和调用中下一个参数值的表达式。
这意味着va_arg不一定求值为左值;获取它扩展的地址是不安全的:左值可以用作表达式,但并非每个表达式都是左值。考虑这个表达式3+4。获取它的地址是没有意义的。
所以,不,你不应该这样做。
更新:正如注释中所指出的,获取不是左值的表达式的地址将导致编译错误。因此,如果代码可以编译,那么它应该是安全的。不可移植性问题的产生是因为它可能无法在va_arg()扩展为非左值的其他平台中编译。