exit函数的头文件问题
c標準對頭文件的解釋:
標準頭文件要有3點特征:
1)冪等性:多次包含和只包含一次沒差別
2)相互獨立性:標準頭文件之間不可互相包含//說明樓上cpazstido是錯的
3)文件級別:頭文件要在全局作用域內(nèi)被包含,在其他作用域內(nèi)(例如函數(shù)塊內(nèi))被包含行為未定義。
另外,c允許良性重定義。也就是重定義一個名字沒有造成危害那么重定義不會導致編譯出錯或報警。
這就可以解釋為什么兩個頭文件都有exit函數(shù)了。因為標準c要求c庫實現(xiàn)exit函數(shù),而最早標準c沒有支持多線程,所以exit在stdlib.h中聲明。后來多線程出現(xiàn)了,c為了支持多線程而出現(xiàn)了process.h,在其中自然而然要聲明exit,兩處聲明完全相同,所以是良性重定義且符合c邊準給頭文件的限制。如果在stdlib.h中刪除exit得聲明那將導致許多現(xiàn)有的程序無法正確聲明exit,這就是向后兼容性的考慮。
最后,c語言允許沒有聲明就使用函數(shù),沒顯式聲明的函數(shù)被隱式聲明成:
extern int funname(void);
所以在c中需要對函數(shù)正確聲明使得編譯器可以正確檢查參數(shù)匹配(對于可變參數(shù)函數(shù)例如printf如果沒有正確聲明調(diào)用將出錯,對一般函數(shù)雖然沒有聲明但是因為_cdecl調(diào)用方式由調(diào)用方清理參數(shù)所以即使參數(shù)傳入與錯誤聲明不一致也能正常工作)
注意,在C++中使用函數(shù)前必須聲明,否則將無法編譯,這點與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函數(shù)
?
http://zhidao.baidu.com/question/134509702.html?fr=ala0
總結
以上是生活随笔為你收集整理的exit函数的头文件问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 出错处理函数abort、exit、ate
- 下一篇: system函数用法