我经常看到带有省略号的教程,例如:
void foo(int i, ...){
int *p = &i;
++p;
//...
}
我只是想知道,这种方法在标准方面是否正确?我可以使用不带va_ *宏的可变参数args吗?也许某些实现以相反的顺序存储args或类似的东西。
UPD :“使用” =可移植且可靠地传递args
答案 0 :(得分:7)
如何将参数传递给函数的机制是特定于实现的。它们可以通过寄存器或其他方法传递到堆栈上,并且该方法可能因数据类型而异。
在C standard的第7.16节中指定的stdarg函数/宏家族(va_start
,va_arg
,va_end
等)将所有这些抽象出来,并且是仅标准的处理变量参数列表的方式。
答案 1 :(得分:3)
我经常看到带有省略号的教程,例如:
仅出于绝对清晰起见-该示例是残酷的,最好避免使用本教程。
是 ...
语法的有效用法(可变模板和宏),不需要使用va_*
工具,但是它们看起来都不像示例您发布的代码。