我得到了一段非常有用的代码:

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

正如我所想,我只是尝试这样做,这是一个宏而不是一个函数,因此它可能会起作用。
我并不是真的希望它能起作用,但是它确实可以满足我的要求。

但是现在我不确定地址的生存期以及这种样式可能发生的其他风险。

谁能告诉我为什么以这种方式使用va_arg值的引用是安全/不安全的吗?

最佳答案

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



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

因此,不,您不应该这样做。

更新:如注释中所指出,采用不是左值的表达式的地址将导致编译错误。因此,如果代码可以编译,那么它应该是安全的。不可移植性问题是由于它可能无法在va_arg()扩展为非左值的其他平台上编译而引起的。

10-06 15:24