c頭文件

標準頭文件要有3點特徵

 

1)冪等性:多次包含和只包含一次沒差別

2)相互獨立性:標準頭文件之間不可互相包含

3)文件級別:頭文件要在全局作用域內被包含,在其他作用域內(例如函數塊內)被包含行爲未定義。

 

另外,c允許良性重定義。也就是重定義一個名字沒有造成危害那麼重定義不會導致編譯出錯或報警。

 

這就可以解釋爲什麼兩個頭文件都有exit函數了。因爲標準c要求c庫實現exit函數,而最早標準c沒有支持多線程,所以exit在stdlib.h中聲明。後來多線程出現了,c爲了支持多線程而出現了process.h,在其中自然而然要聲明exit,兩處聲明完全相同,所以是良性重定義且符合c邊準給頭文件的限制。如果在stdlib.h中刪除exit得聲明那將導致許多現有的程序無法正確聲明exit,這就是向後兼容性的考慮。

 

最後,c語言允許沒有聲明就使用函數,沒顯式聲明的函數被隱式聲明成:

extern int funname(void);

所以在c中需要對函數正確聲明使得編譯器可以正確檢查參數匹配(對於可變參數函數例如printf如果沒有正確聲明調用將出錯,對一般函數雖然沒有聲明但是因爲_cdecl調用方式由調用方清理參數所以即使參數傳入與錯誤聲明不一致也能正常工作)

注意,在C++中使用函數前必須聲明,否則將無法編譯,這點與c不同。

 

補充關於良性重定義:

下面的例子都是良性重定義:

#define a 1

#define a 1

int fun(int);

int fun(int);

下面的例子是惡性重定義,將導致編譯出錯或警告:

#define a 1

#define a 2 /*重定義警告*/

int a = 4;

int a = 4;/*重定義錯誤*/

 

補充一些爲了兼容性考慮或者完備性考慮而良性重定義的例子:

1) define NULL (void *)0

幾乎所有c邊準頭文件(15個)都重定義了NULL

2)malloc.h和stdlib.h都包含了malloc函數

發佈了38 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章