在C中包含保护约定

设置包含警卫的常规方法是什么? 我通常把它们写成(例如h.h):

#ifndef _EXAMPLE_H_ #define _EXAMPLE_H_ #include "example.h" #endif 

强调惯例是否重要? 当我用Google搜索时,我看到了相互矛盾的信息。 _EXAMPLE_H_甚至必须匹配标题的名称吗?

 Does underscore convention matter? 

是。 这很重要。

带有前导下划线和大写字母的标识符保留用于实现。 所以你所拥有的将导致未定义的行为。

以下是C标准用于命名标识符的规范( C11草案 ):

7.1.3保留标识符

每个标头声明或定义其关联子条款中列出的所有标识符,并可选地声明或定义其关联的未来库方向子条款和标识符中列出的标识符,这些标识符始终保留用于任何用途或用作文件范围标识符。

– 所有以下划线开头的标识符以及大写字母或另一个下划线始终保留用于任何用途。

– 所有以下划线开头的标识符始终保留用作普通和标记名称空间中具有文件范围的标识符。

– 如果包含任何相关标题,则保留以下任何子条款中的每个宏名称(包括未来的库方向)以供指定使用; 除非另有明确说明(见7.1.4)。 – 以下任何子条款中包含外部链接的所有标识符(包括未来的库方向)和errno始终保留用作具有外部链接的标识符.144) – 具有文件范围的每个标识符在以下任何子条款中列出(包括未来的库方向)保留用作宏名称和文件范围的标识符,如果包含任何相关的标题,则在同一名称空间中。

没有保留其他标识符。 如果程序在保留它的上下文中声明或定义标识符(除了7.1.4允许的标识符),或者将保留标识符定义为宏名称,则行为是未定义的。

如果程序删除(使用#undef)上面列出的第一个组中的标识符的任何宏定义,则行为是未定义的。

在不违反上述任何规定的情况下,包含保护名称可以是任何内容,并且不必是头文件的名称。 但通常我见过/使用的约定是使用与头文件名相同的名称,这样就不会造成任何不必要的混淆。

关于如何包括警卫的命名,没有绝对的要求。 它不必与标题名称匹配。 我已经看过(并使用过自己)一些使用UUID的东西,基本上是由一个随机生成的hex字符串组成的。

从技术上来说,KingsIndian说,以下划线开头的标识符是保留的:

这些规则,从ANSI Sec。 4.1.2.1,是:

 1. All identifiers beginning with an underscore followed by an upper-case letter or another underscore are always reserved (all scopes, all namespaces). 2. All identifiers beginning with an underscore are reserved for ordinary identifiers (functions, variables, typedefs, enumeration constants) with file scope. ... 

comp.lang.c常见问题列表·问题1.29

也许新的ISO C11(?)标准放松了这些规则,但这已经成为了一段时间的底线。