幂等

如果在翻译单元(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 并不那么放纵。