在没有 va_* 的情况下使用省略号是否可以接受?

Is it acceptable to use ellipsis without va_*?

我经常看到关于省略号的教程有这样的例子:

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

我只是想知道,这种方法在标准方面是否正确?我可以在没有 va_* 宏的情况下使用可变参数吗?也许有些实现以相反的顺序存储 args,或者像这样。

UPD: "Use" = 可移植且可靠地传递参数

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

C standard 的第 7.16 节中指定的函数/宏的 stdarg 系列(va_startva_argva_end 等)抽象了所有这些并且是 唯一 处理可变参数列表的标准兼容方式。

I often see tutorials about ellipsis with examples like this:

只是为了绝对清楚 - 这个例子是残酷的,最好避免教程。

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