我得到了一段非常有用的代码:
void *test;
/*...*/
test = &va_arg(arg_list, int);
正如我所想,我只是尝试这样做,这是一个宏而不是一个函数,因此它可能会起作用。
我并不是真的希望它能起作用,但是它确实可以满足我的要求。
但是现在我不确定地址的生存期以及这种样式可能发生的其他风险。
谁能告诉我为什么以这种方式使用
va_arg
值的引用是安全/不安全的吗? 最佳答案
C99标准的第7.15.1.1节(强调我的):
这意味着va_arg
不一定要评估为左值;将其扩展到的地址作为地址是不安全的:左值可以用作表达式,但并非每个表达式都是左值。考虑表达式3+4
。取那个地址是没有意义的。
因此,不,您不应该这样做。
更新:如注释中所指出,采用不是左值的表达式的地址将导致编译错误。因此,如果代码可以编译,那么它应该是安全的。不可移植性问题是由于它可能无法在va_arg()
扩展为非左值的其他平台上编译而引起的。