【问题标题】:what is FILE_H called in the include guard包含保护中调用的 FILE_H 是什么
【发布时间】:2015-08-03 10:00:22
【问题描述】:

在文件file.h中,可以看到以下代码。

#ifndef FILE_H
#define FILE_H
 ...
 ...
#endif

问题:谁生成了 FILE_H(FILE_H 是否称为标识符?)这个命名约定叫什么?我应该阅读什么以了解更多信息?

目前,我知道这被称为包含保护,以及与预处理器有关的东西。但我似乎无法进一步谷歌。任何链接将不胜感激。

【问题讨论】:

  • ...问题是什么? 程序员生成了FILE_H。我认为没有明显的命名约定的名称。也许我们可以创造一个? Naming-Your-Include-Guards-After-The-File-Name 约定对您有用吗?
  • 我的意思是,我们写的是#ifndef FILE_H,而不是,比如说#ifndef "file.h"。那么谁决定我们应该这样做呢?这是在哪里记录的?
  • 它只是一个标准的 C 宏。您不能使用带引号的字符串,预处理器适用于符号常量。任何介绍性的 C 或 C++ 书籍都应该在前几章中解释这一点。宏是文档化的部分。使用预处理器宏来实现包含防护是一种约定或习惯用法。它恰好是一个无处不在的。
  • 好的,谢谢,正是我正在寻找的。​​span>

标签: include preprocessor


【解决方案1】:

包含保护实际上并不是语言本身的特性,它们只是一种确保同一个头文件不会两次包含在同一个翻译单元中的方法,并且它们是由低级语言特性构建的。

使这成为可能的实际功能是宏替换(特别是类似对象的宏)和条件包含。

因此,要找出FILE_H 的来源,您需要检查两件事。

首先是标准施加的限制(例如C11 6.4.2)。在宏替换中,宏名必须取自有限的字符集,最少包括大小写字母、下划线和数字(还有各种各样的 em>可以允许,例如通用字符名称或其他实现定义的字符,但这是强制基线)。

第二个是开发者的头脑。除了标准的限制之外,开发人员必须提供一个用于包含保护的唯一标识符,最简单的方法是让它以某种方式依赖于文件名本身。因此,一种做法是使用大写文件名,并将. 替换为下划线。

这就是为什么你最终会得到一个包含保护 btree.h 的形式:

#ifndef BTREE_H
#define BTREE_H
    // weave your magic here
#endif

您应该记住,但它并不总是效果很好。有时您可能会得到两个名称相似的头文件,它们使用相同的包含保护名称,从而导致根本不包含其中一个头文件。这种情况很少发生,通常不值得关注。

【讨论】:

    猜你喜欢
    • 2012-12-31
    • 2015-08-04
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 2011-04-21
    相关资源
    最近更新 更多