从exit函数到c标准对头文件的解释

昨天,在用到exit函数时,发现总是出错,无奈之下加了个stdlib.h头文件,ok!

查了下相关的资料:

标准头文件要有3点特征

 

1幂等性:多次包含和只包含一次没差别

2相互独立性:标准头文件之间不可互相包含

3文件级别:头文件要在全局作用域内被包含,在其他作用域内(例如函数块内)被包含行为未定义。

 

另外,c允许良性重定义。也就是重定义一个名字没有造成危害那么重定义不会导致编译出错或报警。

 

这就可以解释为什么两个头文件都有exit函数了。因为标准c要求c库实现exit函数,而最早标准c没有支持多线程,所以exitstdlib.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.hstdlib.h都包含了malloc函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值