2010-11-08 38 views
3

我在gcc中发现了一些奇怪的东西,并希望得到一些输入,无论它是一个特性还是特性。
基本上我有func.c定义的函数作为调用者/被调用者不匹配签名的gcc函数调用语义

void f(int a, int b, FILE* f) 
{ 
    ... 
    ... 
} 

没有对应的头文件。但是,当我调用f(a,b)时,gcc不会给出任何警告,而gdb显示f用三个参数调用? 这是怎么回事?填补第三个参数的语义是什么?

+0

为防万一您好奇,第三个参数可能是任何其他值在堆栈上留下的值,并且可能没有意义(除非NULL值恰好为0)。 – 2010-11-08 20:00:19

回答

4

如果f()在任何地方都没有声明,并且没有在当前编译单元中定义,编译器假定f()返回int并且可以接受任意数量的参数。

我知道这很奇怪,但在过去这可能是一种减少必须包含的头文件数量的方法,因此编译速度更快。

+0

+1这是C89向后兼容性(我认为)从C99中删除的错误特征。如果你提出警告,海湾合作委员会会在发生这种情况时提醒。 – 2010-11-08 19:57:59

+0

默认情况下,gcc 4.4和-std = c99会提示隐式声明(我没有提供任何额外的警告标志。) – bstpierre 2010-11-08 20:13:51

+0

我没有想到它有一个有趣的历史背后。享受吧。感谢所有的投入。我一直在提醒警告。 – Sandeep 2010-11-08 20:27:27

相关问题