【问题标题】:What does the name _headerfile_h mean_headerfile_h 这个名字是什么意思
【发布时间】:2019-07-08 05:46:01
【问题描述】:

我一直在阅读 Zed Shaw 的“Learn C The Hard Way”。在第 20 章中,作者创建了一个头文件,例如headerfile.h 并包含该行 #ifndef _headerfile_h。我了解#ifndef 指令,但不了解_headerfile_h。请解释这个_headerfile_h 或提及任何资源来寻找它。

#ifndef _headerfile_h
#define _headerfile_h

…other material…

#endif /* _headerfile_h */

【问题讨论】:

  • 它被称为“header guard”以防止它被编译两次。在#ifndef ... #endif 块内应该有#define _headerfile_h

标签: c header-files include-guards


【解决方案1】:

它只是一个唯一的名称,仅由该标头使用,以防止标头被包含两次时出现问题。

请注意,一般情况下,您不应创建以下划线开头的函数、变量、标记或宏名称。 C11 §7.1.3 Reserved identifiers 的一部分说:

  • 以下划线和大写字母或另一个下划线开头的所有标识符始终保留以供任何使用。
  • 以下划线开头的所有标识符始终保留用作普通和标记名称空间中具有文件范围的标识符。

另见:

可能还有其他一些人。其中一些问题与其他资源有进一步的链接——SO 问题和外部链接。

【讨论】:

    【解决方案2】:

    指令#ifndef 检查“参数”是否定义为宏。如果它定义(ifndef 中的n 代表“非”),那么匹配#endif 的下一个块将由预处理器传递。

    如果定义了宏,则跳过该块,预处理器不会将其传递给编译器。

    所以#ifndef _headerfile_h 所做的是检查符号_headerfile_h 是否定义为宏。

    从宏名称看来,这是标题 include guard 的一部分。

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 2013-12-19
      • 2011-04-11
      • 2018-10-29
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 2017-05-25
      • 2013-02-21
      相关资源
      最近更新 更多