使用不带va_ *的省略号可以接受吗?

时间:2018-07-10 17:11:43

标签: c++ c standards

我经常看到带有省略号的教程,例如:

void foo(int i, ...){
    int *p = &i;
    ++p;
    //...
}

我只是想知道,这种方法在标准方面是否正确?我可以使用不带va_ *宏的可变参数args吗?也许某些实现以相反的顺序存储args或类似的东西。

UPD :“使用” =可移植且可靠地传递args

2 个答案:

答案 0 :(得分:7)

如何将参数传递给函数的机制是特定于实现的。它们可以通过寄存器或其他方法传递到堆栈上,并且该方法可能因数据类型而异。

C standard的第7.16节中指定的stdarg函数/宏家族(va_startva_argva_end等)将所有这些抽象出来,并且是标准的处理变量参数列表的方式。

答案 1 :(得分:3)

  

我经常看到带有省略号的教程,例如:

仅出于绝对清晰起见-该示例是残酷的,最好避免使用本教程。

...语法的有效用法(可变模板和宏),不需要使用va_*工具,但是它们看起来都不像示例您发布的代码。