带省略号的函数定义

Som*_*ame 1 c function ellipsis language-lawyer

我对带有可变数量参数的函数的语义有误解。6.5.2.2(p6)

如果使用包含原型的类型定义函数,并且原型以省略号(,...)结尾,或者升级后的参数类型与参数类型不兼容,则行为是不确定的。

这还不是很清楚。在原型下面的功能定义中,是否以省略号结尾?

void foo(int i, ...){
    //...
}
Run Code Online (Sandbox Code Playgroud)

起初我以为是关于函数的,参数列表仅包含省略号,例如

void foo(...){
    //...
}
Run Code Online (Sandbox Code Playgroud)

但是这种情况是由6.9.1(p8)

如果定义了接受可变数量参数的函数而没有以省略号结尾的参数类型列表,则该行为未定义

所以我真的不明白他们的意思是什么

要么原型以省略号(,...)结尾

6.5.2.2(p6)

Igo*_*nik 5

本段讨论了一个函数调用表达式提到一个没有原型的函数的情况。在这种情况下,编译器必须根据调用的参数类型来猜测其参数的类型。

如果该函数被定义为可变参数(可能在另一个翻译单元中),或者参数类型与编译器的猜测不符,则该行为未定义。

  • 它是在某处定义的,但在此特定调用表达式中看不到其原型的地方。例如,在另一个源文件中。由于历史原因,C允许突然调用函数,而不会看到其声明。因此,您可以编写`int main(){return f(1,2); }`,编译器不由自主地希望能够在某个地方存在`int f(int,int)`的定义。相反,如果您在另一个源文件中定义“ int f(double,double)”或“ int f(int,...)”,则该调用的行为是不确定的。 (2认同)