標籤:

如何通俗地解釋 C 語言中 #include<> 的用途?


把尖括弧里的文件複製粘貼過來


舉個例子:

#include&
int main()
{
printf("%s
","hello world");
return 0;
}

可以看到中間有一個printf調用。

printf也不是天生就有的啊,是有人(MSVC,GCC,CLANG的C標準庫實現者)對其進行了定義才可以使用對不對?

你自己寫函數也是如此,定義了才能使用。

在代碼前面包含頭文件主要是為了對其進行「聲明」。

這樣編譯器在編譯代碼的時候,會去查找之前聲明的函數原型。

再根據函數原型去找函數的定義。函數的定義可能在源文件,或者動態庫中。

(也有人把聲明放在頭文件中的)

那printf為啥在所有的平台(Android,win,linux,OSX)都能列印同樣的字元串啊?因為編譯器的庫作者在實現它的時候分別調用了各個操作系統的API。只是看起來在每個平台都列印一樣的字元串而已,實際上各操作系統為列印這個字元串做的事情可能並不一樣。比如在linux下是打開標準輸出的文件描述符寫入一個字元串常量「hello world」,而在windows下是打開標準輸出的文件句柄(handle)寫入同樣的字元串常量。


Read The Fxxking Manual


這是個宏命令,作用是編譯的準備階段(預編譯階段)從環境變數或變異參數指定的路徑中找到指定的文件並且在使用#include的文件中展開。

如果你編譯時指定只執行預編譯並且看一下查看預編譯生成的文件的話,就會發現原來使用#include的地方已經被換成了頭文件內容,並且在開頭用#define定義的宏也被替換成了原文。


看到 @陳碩關注了這個問題,我肯定我以前理解錯了,等大牛來回答.....


就是把那個文件的內容全部拷貝過來


編譯器預編譯的時候會進行展開,包括#include的頭文件以及各種#define,#if等宏定義,預編譯處理後的代碼就不包含任何#和注釋了。所以#include的工作也就是告訴編譯器將相關代碼複製粘貼過來。


C 語言的變數、函數、結構體、枚舉類型等,在使用之前都需要聲明。

如果我們把一個函數實現在某個 .c 文件中,其它的 .c 文件都需要在調用這個函數之前聲明之。

為了減少這種重複勞動,我們就在 .h 文件里聲明,在調用之前 include 之。


為什麼這種題都有人答。。。難道書上沒有么。。。


就是在程序運行前把一個文件包含到這個文件中


推薦閱讀:

C語言 主函數退出前,還佔用了大量的內存,是什麼原因造成的呢?
vc++6.0是不是很多優點?如何使用visual studio2013達到相同的功能?
為什麼 C 語言中的一些特性不被 C++ 支持?

TAG:C編程語言 |