我的C代碼以下位:在C文件中使用它們之前不應該總是需要定義函數嗎?
int main() {
myFunctionABC(2);
return 0;
}
void myFunctionABC(int n) {
printf("%d\n", n);
}
所以......這段代碼工作,我不明白爲什麼。我一直認爲C編譯器總是需要每個被引用的函數已經「已知」,否則會導致編譯過程失敗。
這是爲什麼這個工作?
我的C代碼以下位:在C文件中使用它們之前不應該總是需要定義函數嗎?
int main() {
myFunctionABC(2);
return 0;
}
void myFunctionABC(int n) {
printf("%d\n", n);
}
所以......這段代碼工作,我不明白爲什麼。我一直認爲C編譯器總是需要每個被引用的函數已經「已知」,否則會導致編譯過程失敗。
這是爲什麼這個工作?
這不是錯誤的實際調用它,即使它的定義是在隨後的位置之前聲明函數原型,但它是一個很好的做法,以幫助編譯器,檢this similar post
GCC理所當然地抱怨:
make 4356180
4356180.c:6: warning: conflicting types for ‘myFunctionABC’
4356180.c:2: note: previous implicit declaration of ‘myFunctionABC’ was here
如果我加-Wall,我得到這些的好:
make CFLAGS=-Wall 4356180
4356180.c: In function ‘main’:
4356180.c:2: warning: implicit declaration of function ‘myFunctionABC’
療法e從來沒有任何要求定義函數之前調用它們在C或C + +(作爲您的問題的標題建議)。在調用它們之前,C++和C99(以及某些情況下在C89/90中)需要的是聲明函數。
至於你的代碼...你的代碼不是「工作」。最好的希望是你的代碼會產生未定義的行爲,只會發生類似於「工作」的情況。首先,代碼甚至不會編譯爲C++或C99(並且您將問題標記爲C和C++)。 C++和C99在調用之前無條件地要求函數爲,聲明爲。其次,用C89/90編譯器代碼可能會編譯,但無論如何會產生上述未定義的行爲。即使在C89/90調用可變參數函數(如printf
)中沒有首先聲明它們也是非法的 - 它會產生未定義的行爲。
對於調用它們而不聲明它們的非變量函數是可以的 - C89/90的隱式聲明規則將處理這個問題。但是這些規則會使編譯器得出結論:您未聲明的myFunctionABC
函數返回int
,而實際上您將其定義爲返回void
- 這種差異導致未定義的行爲。大多數自尊的編譯器至少會告訴你這個問題。
這是什麼編譯器? – Tom 2010-12-04 22:31:29
你確定你沒有在頭文件中的某處聲明。 – 2010-12-04 22:40:37