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