【问题标题】:Include guard conventions in C在 C 中包含守卫约定
【发布时间】:2013-06-22 20:27:42
【问题描述】:

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

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

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

【问题讨论】:

  • 我相信这已经被彻底覆盖了,here
  • 或者更好的是,如果您正在寻找更广泛的主题报道,请考虑google-styleguide.googlecode.com/svn/trunk/…。也可以阅读google style guide,仅供参考
  • 另一个是 C++,它是一种不同于 C 的编程语言。约定是相似的 - 现在 - 但是,但理由不同。

标签: c include-guards


【解决方案1】:
Does underscore convention matter?

是的。这很重要。

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

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

7.1.3 保留标识符

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

——所有以下划线开头的标识符 大写字母或其他下划线始终保留给任何 使用。

——所有以下划线开头的标识符总是被保留 在普通和标签中用作具有文件范围的标识符 命名空间。

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

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

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

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

【讨论】:

  • 一种常见的约定是将标头名称映射为大写并将.h 替换为_H,因此foobar.h 的保护将是FOOBAR_H。如果名称以“e”开头,例如"elvis.h",则保护宏将为ELVIS_H -- 并且以E 和数字或大写字母开头的宏保留供<errno.h> 使用。实现将ELVIS_H 定义为错误代码的可能性极小,但您可以通过使用H_HEADER_NAME 而不是HEADER_NAME_H 之类的约定来避免这种可能性。
【解决方案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 FAQ list · Question 1.29

也许新的 ISO C11 (?) 标准放宽了这些规则,但这是一段时间以来的底线。

【讨论】:

  • -1。这不是关于下划线的规则。如果你不以下划线开头而是使用 UUID,那么你很可能以数字开头。
  • 不是原始 UUID,而是类似于 INCLUDED_AF3430340AB3012FE0DEADBEEF
  • 标识符以下划线开头,后跟第二个下划线或大写字母,保留供任何使用。所有以下划线开头的标识符都保留用作普通和标记名称空间中具有文件范围的标识符。了解确切的规则是件好事,但明智的做法是保守一点,避免定义 anything 以下划线开头。
  • 不,ISO C11 没有放宽规则。
猜你喜欢
  • 2019-04-25
  • 2012-01-19
  • 2017-11-21
  • 2017-07-31
  • 2011-01-24
  • 2022-01-22
  • 1970-01-01
  • 2015-03-04
相关资源
最近更新 更多