Include的次序

今天解了一个问题.
main.c中的include中的次序是
#include "../dec_h/vt7218.h"
#include "../dec_h/ifunctin.h
#include "../dec_h/isystem.h"
 
第一个被include的是vt7218.h
 
在vt7218.h中, 会
首先判断__vt7218_H有没有被定义, 没有, 就把__vt7218_H给定义了
 
#ifndef __vt7218_H
#define __vt7218_H
 
然后:
#include "../dec_h/isystem.h"
 
and then, 在isystem.h中
首先判断__INTR_SYS_H有没有被定义, 没有, 就把__INTR_SYS_H给定义了
 
#ifndef __INTR_SYS_H
#define __INTR_SYS_H
 
然后:
#include "../dec_h/vt7218.h"
 
这时, 判断__vt7218_H已经被定义了, 就不会再include issystem.h了.
 
所以首先展开的是isystem.h
会执行:
#ifdef READ_AHEAD
#define  CMD_SET_READ_AHEAD                                 0xA7 /* 注意, 这时READ_AHEAD尚未被define */
#endif
然后展开vt7218.h
会执行:
#define READ_AHEAD                               // by Bruce  03/04/11 /* 这时, READ_AHEAD才被define了 */
所以这时你可以看到, 为什么在main.c中, CMD_SET_READ_AHEAD会未定义了
 
所以其实这三个include文件的正确顺序应该是:
#include "../dec_h/isystem.h"
#include "../dec_h/vt7218.h"
#include "../dec_h/ifunctin.h
issystem.h一定要在vt7218.h和ifunctin.h的上面include, 这样可以确保READ_AHEAD先被定义

总结:

include 本质上就是把文件的内容 copy paste 到相应的位置.
毕竟 C/C++ 的编译模型是基于文件单元的. 理解这点就明白 include 次序的含义了

按 Thinking in C++ 第2版第一卷的建议.
越特殊的 .h 越先 include 比较合适.
既, 先包含最特殊的, 当前 cpp 实现的类的类声明头文件
再包含自己实现的一些工具文件
再包含第3方库文件
再包含系统提供的头文件
再是标准头文件
另加一点, 最先包含配置文件, 即编译宏开关
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值