有誰能告訴我爲什麼不是包括stdio.h
而仍然使用printf
函數只給gcc一個警告?printf只給出警告
警告:內建函數「printf的」不兼容的隱式聲明
而這應該是一個編譯錯誤,因爲我們包括未聲明的函數。
這是否與鏈接過程有關?請詳細說明。
有誰能告訴我爲什麼不是包括stdio.h
而仍然使用printf
函數只給gcc一個警告?printf只給出警告
警告:內建函數「printf的」不兼容的隱式聲明
而這應該是一個編譯錯誤,因爲我們包括未聲明的函數。
這是否與鏈接過程有關?請詳細說明。
如果您沒有爲您在代碼中使用的函數提供簽名,編譯器將(隱式)對未知函數接受什麼作爲參數列表做出一些假設,並作爲結果返回。
這些假設是基於您對該功能的使用,例如,給出printf("%s", (char *) string)
,編譯器將決定printf
是一個函數,它需要一個可變參數列表,並返回一個int
,這個函數完全需要2個char *
- 而不是。
問題可能發生在鏈接期間,當這些假設變成與實際功能不兼容時。
它很可能與您的編譯器和默認庫有關。如果您正在使用已經使用printf的標準庫(可能是調試版本),那麼printf將位於全局名稱空間中並進行鏈接。編譯器警告你,你沒有明確聲明printf。您可以打開-Werror使所有警告錯誤,然後編譯器不會讓它進入鏈接器階段。
pb2q的回答是正確的。這個答案提供了關於你提出的特定警告信息的一些額外解釋。
GCC爲printf
定義了一個內置函數。內置函數具有適當的原型:
int printf(const char *, ...);
但是,隱式聲明假定固定數量的參數。因此,假設你的程序看起來像:
int main() {
printf("%s\n", "Hello, World!");
return 0; // not required in C 2011
}
那麼對於printf
隱含的聲明將是:
int printf(char *, char *);
不匹配的內置函數的類型,的,因此措辭警告。您可能在該消息之前收到一條警告消息,抱怨缺少原型。
warning: implicit declaration of function 'printf'
關鍵字:*隱式聲明* – chris 2012-08-13 18:16:56
@Levon它不是。 – akash 2012-08-13 18:18:57
@chris還有這樣的關鍵字嗎?以及編譯器如何鏈接到這個聲明? – akash 2012-08-13 18:19:45