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方庫文件
再包含系統提供的頭文件
再是標準頭文件
另加一點, 最先包含配置文件, 即編譯宏開關
發佈了20 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章