2013-08-28 23 views
2

我在「Kernighan and Ritchie編寫的C語言編程語言」一書中讀到,如果我在實際聲明/定義它之前調用一個帶有返回類型int或void的函數,它應該可以很好地工作。但是當我在代碼塊上運行它時,我仍然會收到警告。在聲明和定義之前可以調用帶int或void返回類型的函數嗎?

#include<stdio.h> 
#include<conio.h> 
int main() 
{ 
    display(); 
} 
void display() 
{ 
    printf("Hello World\n"); 
} 

警告是:「顯示類型衝突」。

但是,如果我的計劃更改爲:

#include<stdio.h> 
#include<conio.h> 
void display() 
{ 
    printf("Hello World\n"); 
} 
int main() 
{ 
    display(); 
} 

它的工作原理沒有任何警告。這是爲什麼?請幫忙。

+2

你也可以閉上你的眼睛穿過主要道路,但這並不是一個好主意。 – paxdiablo

+0

感謝您向我介紹這一概念。 – amiageek

回答

6

您在聲明它之前打電話給display。當你這樣做時,編譯器會對返回值的類型進行假設。它假定它是int。但是當你定義函數時,你使用的是類型void的返回值,這是衝突。

這是一段很長的時間,因爲任何人都認爲調用尚未聲明的函數是合理的。所以,在調用它們之前聲明所有函數。最好配置你的編譯器,以便它拒絕嘗試調用尚未聲明的函數。

+0

明白了,謝謝! – amiageek

1

如果函數在編譯器沒有看到它的原型時調用,它假定返回類型爲int

但是,自C99以來,此功能(稱爲隱式函數聲明)被刪除,您不應該依賴它。

使用函數的聲明顯然是一個更好的選擇:

void display(void); 
int main(void) 
{ 
    display(); 
} 
void display(void) 
{ 
    printf("Hello World\n"); 
} 
0

只有int返回類型默認情況下不承擔void。你必須參考一個更新的標準。

1

main函數之前使用函數原型就像這樣:

void display(); 

int main() 
{ 
    display(); 
} 

void display() 
{ 
    printf("Hello World\n"); 
} 
3

你宣佈之前調用該函數。如果你已經在某處讀過這本書,那就提到功能原型減速。

#include<stdio.h> 
#include<conio.h> 
void display(void); // function prototype decleration 
int main() 
{ 
    display(); 
} 
void display() 
{ 
    printf("Hello World\n"); 
} 

希望這有助於總是定義一個原型。

相關問題