C語言 - .c和.h文件的困惑


本質上沒有任何區別。 只不過一般:.h文件是頭文件,內含函數聲明、宏定義、結構體定義等內容。

.c文件是程序文件,內含函數實現,變量定義等內容。而且是什么后綴也沒有關系,只不過編譯器會默認對某些后綴的文件采取某些動作。你可以強制編譯器把任何后綴的文件都當作c文件來編。

這樣分開寫成兩個文件是一個良好的編程風格。

而且,比方說 我在aaa.h里定義了一個函數的聲明,然后我在aaa.h的同一個目錄下建立aaa.c ,aaa.c里定義了這個函數的實現,然后是在main函數所在.c文件里#include這個aaa.h 然后我就可以使用這個函數了。 main在運行時就會找到這個定義了這個函數的aaa.c文件。

這是因為:main函數為標准C/C++的程序入口,編譯器會先找到該函數所在的文件

從C編譯器角度看,.h和.c皆是浮雲,就是改名為.txt、.doc也沒有大的分別。換句話說,就是.h和.c沒啥必然聯系。.h中一般放的是同名.c文件中定義的變量、數組、函數的聲明,需要讓.c外部使用的聲明。這個聲明有啥用?只是讓需要用這些聲明的地方方便引用。因為 #include "xx.h" 這個宏其實際意思就是把當前這一行刪掉,把 xx.h 中的內容原封不動的插入在當前行的位置。由於想寫這些函數聲明的地方非常多(每一個調用 xx.c 中函數的地方,都要在使用前聲明一下子),所以用 #include "xx.h" 這個宏就簡化了許多行代碼--讓預處理器自己替換好了。也就是說,xx.h 其實只是讓需要寫 xx.c 中函數聲明的地方調用(可以少寫幾行字),至於 include 這個 .h 文件是誰,是 .h 還是 .c,還是與這個 .h 同名的 .c,都沒有任何必然關系。

這樣你可能會說:啊?那我平時只想調用 xx.c 中的某個函數,卻 include了 xx.h 文件,豈不是宏替換后出現了很多無用的聲明?沒錯,確實引入了很多垃圾,但是它卻省了你不少筆墨,並且整個版面也看起來清爽的多。魚與熊掌不可得兼,就是這個道理。反正多些聲明(.h一般只用來放聲明,而放不定義)也無害處,又不會影響編譯,何樂而不為呢?

(1)通過頭文件來調用庫功能。在很多場合,源代碼不便(或不准)向用戶公布,只要向用戶提供頭文件和二進制的庫即可。用戶只需要按照頭文件中的接口聲明來調用庫功能,而不必關心接口怎么實現的。編譯器會從庫中提取相應的代碼。

(2)頭文件能加強類型安全檢查。如果某個接口被實現或被使用時,其方式與頭文件中的聲明不一致,編譯器就會指出錯誤,這一簡單的規則能大大減輕程序員調試、改錯的負擔。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM