现在的位置: 首页 > 综合 > 正文

Include的次序

2013年08月07日 ⁄ 综合 ⁄ 共 1106字 ⁄ 字号 评论关闭
今天解了一个问题.
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方库文件
再包含系统提供的头文件
再是标准头文件
另加一点, 最先包含配置文件, 即编译宏开关

抱歉!评论已关闭.