Include防範

在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 GRANDPARENT_H
#define GRANDPARENT_H

struct foo {
    int member;
};

#endif
檔案「father.h」
#include "grandfather.h"
檔案「child.c」
#include "grandfather.h"
#include "father.h"
此處grandfather.h第一次被引入時會定義巨集GRANDPARENT_H。當father.h再次引入grandfather.h時，#ifndef測試失敗，編譯器會直接跳到#endif的部分，也避免了第二次定義foo結構。程式也就能夠正常編譯。

 困難 
為了讓#include防範正確運作，每個防範都必須檢驗並且有條件地設定不同的前置處理巨集。因此，使用了#include防範的方案必須制訂一致性的命名方法，並確定這個方法不會和其他的標頭檔或任何可見的全域變數衝突。

為了解決這個問題，許多C和C++程式開發工具提供非標準的指令#pragma once。在標頭檔中加入這個指令，能夠保證這個檔案只會被引入一次。不過這個方法會被潛在性顯著的困難阻撓，無論#include指令是否在不同的地方，但實際上起源於相同的開頭（舉例，請參考符號連結）。同樣的，因為#pragma once不是一個標準的指令，它的語意在不同的程式開發工具中也許會有微妙的不同。

 参考文献 

 外部連結 
 引入防範的最佳化
 多餘的引入防範
 引入防範生成器

Category:C語言
#include