我在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