維基百科,自由的百科全書
在
C 和
C++ 程式語言中,
#include 防範,有時被稱作
巨集防範,用於處理
#include 指令時,可避免
重複引入的問題。在
標頭檔加入 #include 防範是一種讓檔案
等冪的方法。
[編輯] 重複引入
以下的C語言程式展示了缺少 #include 防範時會出現的問題:
- 檔案「grandfather.h」
struct foo {
int member;
};
- 檔案「father.h」
#include "grandfather.h"
- 檔案「child.c」
#include "grandfather.h"
#include "father.h"
此處
child.c間接引入了兩份
grandfather.h標頭檔中的內容。明顯可以看出,
foo 結構被定義兩次,因此會造成編譯錯誤。
[編輯] 使用 #include 防範
- 檔案「grandfather.h」
#ifndef H_GRANDFATHER
#define H_GRANDFATHER
struct foo {
int member;
};
#endif
- 檔案「father.h」
#include "grandfather.h"
- 檔案「child.c」
#include "grandfather.h"
#include "father.h"
此處
grandfather.h第一次被引入時會定義巨集
H_GRANDFATHER。當
child.h再次引入
grandfather.h時,
#ifndef測試失敗,
編譯器會直接跳到
#endif的部分,也避免了第二次定義
foo結構。程式也就能夠正常編譯。
[編輯] 困難
為了讓
#include 防範正確運作,每個防範都必須檢驗並且有條件地設定不同的
前置處理巨集。因此,使用了
#include 防範的方案必須制訂一致性的命名方法,並確定這個方法不會和其他的
標頭檔或任何可見的全域變數衝突。
為了解決這個問題,許多 C 和 C++ 程式開發工具提供非標準的指令
#pragma once。在
標頭檔中加入這個指令,能夠保證這個檔案只會被引入一次。不過這個方法會被潛在性顯著的困難阻撓,無論
#include 指令是否在不同的地方,但實際上起源於相同的開頭(舉例,請參考
符號連結)。同樣的,因為
#pragma once 不是一個標準的指令,它的語意在不同的程式開發工具中也許會有微妙的不同。
[編輯] 外部連結