11

设置包含防护的常规方法是什么?我通常将它们写为(例如.h):

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

下划线约定重要吗?当我用谷歌搜索时,我看到了相互矛盾的信息。_EXAMPLE_H_甚至必须匹配标题的名称吗?

4

2 回答 2

17
Does underscore convention matter?

是的。这很重要。

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

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

7.1.3 保留标识符

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

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

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

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

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

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

在不违反上述任何规定的情况下,包含保护名称可以是任何内容,而不必是头文件的名称。但通常我看到/使用的约定是使用与头文件名相同的名称,以免造成任何不必要的混淆。

于 2013-06-25T21:24:17.723 回答
-2

对于如何命名包含守卫没有绝对要求。它不必与标题名称匹配。我见过(并且自己使用过)一些使用 UUID 的,基本上由随机生成的十六进制字符串组成。

正如 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 (?) 标准放宽了这些规则,但这是一段时间以来的底线。

于 2013-06-25T22:58:15.677 回答