我在gcc中发现了一些奇怪的东西,并希望得到一些输入,无论它是一个特性还是特性。
基本上我有func.c定义的函数作为调用者/被调用者不匹配签名的gcc函数调用语义
void f(int a, int b, FILE* f)
{
...
...
}
没有对应的头文件。但是,当我调用f(a,b)时,gcc不会给出任何警告,而gdb显示f用三个参数调用? 这是怎么回事?填补第三个参数的语义是什么?
我在gcc中发现了一些奇怪的东西,并希望得到一些输入,无论它是一个特性还是特性。
基本上我有func.c定义的函数作为调用者/被调用者不匹配签名的gcc函数调用语义
void f(int a, int b, FILE* f)
{
...
...
}
没有对应的头文件。但是,当我调用f(a,b)时,gcc不会给出任何警告,而gdb显示f用三个参数调用? 这是怎么回事?填补第三个参数的语义是什么?
如果f()
在任何地方都没有声明,并且没有在当前编译单元中定义,编译器假定f()
返回int
并且可以接受任意数量的参数。
我知道这很奇怪,但在过去这可能是一种减少必须包含的头文件数量的方法,因此编译速度更快。
为防万一您好奇,第三个参数可能是任何其他值在堆栈上留下的值,并且可能没有意义(除非NULL值恰好为0)。 – 2010-11-08 20:00:19