今天解了一个问题.
main.c中的include中的次序是
main.c中的include中的次序是
#include "../dec_h/vt7218.h"
#include "../dec_h/ifunctin.h
#include "../dec_h/isystem.h"
#include "../dec_h/isystem.h"
第一个被include的是vt7218.h
在vt7218.h中, 会
首先判断__vt7218_H有没有被定义, 没有, 就把__vt7218_H给定义了
#ifndef __vt7218_H
#define __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
#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
#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方库文件
再包含系统提供的头文件
再是标准头文件
越特殊的 .h 越先 include 比较合适.
既, 先包含最特殊的, 当前 cpp 实现的类的类声明头文件
再包含自己实现的一些工具文件
再包含第3方库文件
再包含系统提供的头文件
再是标准头文件
另加一点, 最先包含配置文件, 即编译宏开关