我在gcc中发现了一些奇怪的东西,希望获得一些反馈,看它是一种特性还是怪癖。
基本上,我在func.c中定义了一个函数:
void f(int a, int b, FILE* f)
{
...
...
}
没有相应的头文件,但是当我调用f(a,b)时,gcc没有给出任何警告,gdb显示f被三个参数调用? 为什么会这样?填充第三个参数的语义是什么。
f()
没有在任何地方声明并且没有在当前编译单元中定义,编译器会假定 f()
返回 int
并且可以接受任意数量的参数。f
可以接受任意数量的参数”。那将是一个可变参数函数,必须在参数列表中使用...
进行原型声明。相反,编译器假定您知道自己在做什么,并使用确切数量和类型的参数(在默认提升之后)调用它所需的函数。如果您违反了这个约定,您的程序就会出现未定义的行为。 - R.. GitHub STOP HELPING ICE
NULL
的0)。 - Chris Lutz