什么是FILE_H在包含守卫中调用

时间:2013-03-29 08:14:17

标签: include preprocessor

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

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

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

目前,我知道这被称为包括警卫,以及与预处理器有关的事情。但我似乎无法谷歌进一步。任何链接都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

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

实现此功能的实际功能是宏替换(特别是类似对象的宏)和条件包含。

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

第一个是标准所施加的限制(例如C11 6.4.2)。在宏替换中,宏名称必须从有限的字符集中提取, minimum 包括大写和小写字母,下划线和数字(有各种各样的附加项<允许使用em> can ,例如通用字符名称或其他实现定义的字符,但这是强制基线。)

第二个是开发人员的想法。除了标准的约束之外,开发人员必须提供用于包含守卫的唯一标识符,最简单的方法是使其以某种方式依赖于文件名本身。因此,一种做法是使用大写文件名,并用下划线替换.

这就是为什么你最终会得到btree.h形式的包含守卫:

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

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