2012-08-13 40 views
3

有誰能告訴我爲什麼不是包括stdio.h而仍然使用printf函數只給gcc一個警告?printf只給出警告

警告:內建函數「printf的」不兼容的隱式聲明

而這應該是一個編譯錯誤,因爲我們包括未聲明的函數。

這是否與鏈接過程有關?請詳細說明。

+9

關鍵字:*隱式聲明* – chris 2012-08-13 18:16:56

+1

@Levon它不是。 – akash 2012-08-13 18:18:57

+1

@chris還有這樣的關鍵字嗎?以及編譯器如何鏈接到這個聲明? – akash 2012-08-13 18:19:45

回答

8

如果您沒有爲您在代碼中使用的函數提供簽名,編譯器將(隱式)對未知函數接受什麼作爲參數列表做出一些假設,並作爲結果返回。

這些假設是基於您對該功能的使用,例如,給出printf("%s", (char *) string),編譯器將決定printf是一個函數,它需要一個可變參數列表,並返回一個int,這個函數完全需要2個char * - 而不是

問題可能發生在鏈接期間,當這些假設變成與實際功能不兼容時。

0

它很可能與您的編譯器和默認庫有關。如果您正在使用已經使用printf的標準庫(可能是調試版本),那麼printf將位於全局名稱空間中並進行鏈接。編譯器警告你,你沒有明確聲明printf。您可以打開-Werror使所有警告錯誤,然後編譯器不會讓它進入鏈接器階段。

5

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'