冪等

如果在翻譯單元(TU)中多次包含特定標頭檔案,則不應存在任何編譯問題。這被稱為冪等; 你的標題應該是冪等的。想想如果你必須確保只包含一次 #include <stdio.h>,生活會有多麼困難。

有兩種方法可以實現冪等性:標題保護和 #pragma once 指令。

頭衛

割臺防護裝置簡單可靠,符合 C 標準。標頭檔案中的第一個非註釋行應該是以下形式:

#ifndef UNIQUE_ID_FOR_HEADER
#define UNIQUE_ID_FOR_HEADER

最後一個非評論行應該是 #endif,可選擇在其後面新增註釋:

#endif /* UNIQUE_ID_FOR_HEADER */

所有操作程式碼,包括其他 #include 指令,都應該在這些行之間。

每個名稱必須是唯一的。通常,使用諸如 HEADER_H_INCLUDED 之類的名稱方案。一些舊程式碼使用定義為標題保護的符號(例如 <stdio.h> 中的 #ifndef BUFSIZ),但它不如唯一名稱可靠。

一種選擇是使用生成的 MD5(或其他)雜湊作為報頭保護名稱。你應該避免模擬系統頭使用的方案,這些方案經常使用為實現保留的名稱 - 名稱以下劃線開頭,後跟另一個下劃線或大寫字母。

#pragma once 指令

或者,一些編譯器支援 #pragma once 指令,該指令與標題保護所示的三條線具有相同的效果。

#pragma once

支援 #pragma once 的編譯器包括 MS Visual Studio 和 GCC 以及 Clang。但是,如果擔心可移植性,最好使用標頭保護,或使用兩者。現代編譯器(支援 C89 或更高版本的編譯器)必須忽略它們不識別的編譯指示(‘任何未被實現識別的編譯指示被忽略’),但舊版本的 GCC 並不那麼放縱。