2012-11-28 160 views
2

可能重複的文件stdio.h中:
Why #include <stdio.h> is *not* required to use printf()?忽略C文件

我面臨的一個問題,在下面給出的代碼。

int main() 
{ 
printf("\nHello Stack Overflow\n\n") ; 
return 0 ; 
} 

在上面提到的代碼中,我留下了包括「#include」的代碼。 如果我編譯並執行這段代碼,輸出將按預期打印。但是「#include」是C程序中最重要的東西,我忽略了它,並且編譯完成後沒有任何錯誤,但帶有警告。

這是怎麼發生的?

+0

關於隱式聲明的最後兩個問題... http://stackoverflow.com/questions/13602546/why-its-possible-to-invoke-a-function-declared-later-in-c – hmjd

+0

嘗試'gcc - 牆test.c'你會看到警告 – Omkant

回答

2

在C中,未聲明的函數隱含地被認爲返回int並取參數int

這是不好的做法並會咬你。例如,如果要打印的數據與int的大小不同,如doublefloat

+0

你清除我的困惑。我寫了一個返回void *的函數,但我忘記聲明它。它在32位機器上運行良好。但在64位上它總是返回32位。謝謝 – louxiu

0

人GCC

-nostdlib 
     Do not use the standard system startup files or libraries when linking. No startup files and only the libraries you specify will be 
     passed to the linker. The compiler may generate calls to "memcmp", "memset", "memcpy" and "memmove". These entries are usually 
     resolved by entries in libc. These entry points should be supplied through some other mechanism when this option is specified. 
+0

這可能是OP的問題,但我不這麼認爲。如果我們明白,包含頭文件並沒有提供函數的實現,只提供了它的原型,反過來說,忽略必要的頭文件並不會刪除函數的實現,而只是其原型。我認爲OP的問題是他爲什麼沒有收到警告。 –

+0

OP提到*編譯完成時沒有任何錯誤,但帶有警告。*還閱讀關於* -nostdlib * – tuxuday

0

的printf符號是不是在編譯時已知,但的libc在聯implicite成二進制...這是如何工作的。