2010-11-08 93 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

相關問題