关于#ifndef...#define...#endif

在头文件的开头和结尾,我们经常看到这样的语句(以ctrl.h为例):

#ifndef _CTRL_H_
#define _CTRL_H_
...
...
#endif // end of _CTRL_H_ definition

其目的是防止头文件的“重复包含”,这里的“重复包含”是什么意思呢?

其实这里的“重复包含”是指被同一个文件“重复包含”,比如main.c中包含了ctrl.h和pid.h,但是ctrl.h中又包含了pid.h,这样,就可以避免pid.h在main.c中被“重复包含”。

对于不同的文件包含同一个头文件,比如main.c和ctrl.c中都包含了pid.h,在编译阶段,这两个编译单元都会分别包含pid.h的,即使他们使用了#ifndef…#define…#endif。这也是不建议在头文件中定义非inline函数和非static变量的原因,因为如果定义了这类函数或者变量,会造成“重定义”。

至于应该在头文件中定义inline函数的原因,在之前的博文中已经介绍过,不再赘述。而static变量具有文件作用域,仅在定义它们的文件内可见,假如pid.h中定义了static int refValue,而main.c和ctrl.c中都包含了pid.h,那么main.c和ctrl.c中使用的refValue是两个相互独立的refValue。《嵌入式系统高级C语言编程》一书指出:如果一个工程文件由很多人共同完成,这些文件又是各自编译的,这就难免使得某些人使用了一样的全局变量名,那么为了以后程序中各自的变量和函数互不干扰,就可以使用static修饰符,这样对链接到同一个程序的其他代码文件而言就是不可见的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值