在文件file.h
中,可以看到以下代码。
#ifndef FILE_H
#define FILE_H
...
...
#endif
问题:谁生成了 FILE_H(FILE_H 被称为标识符吗?)这个命名约定叫什么?我应该阅读什么以了解更多信息?
目前,我知道这被称为包含保护,以及与预处理器有关的东西。但我似乎无法进一步谷歌。任何链接将不胜感激。
在文件file.h
中,可以看到以下代码。
#ifndef FILE_H
#define FILE_H
...
...
#endif
问题:谁生成了 FILE_H(FILE_H 被称为标识符吗?)这个命名约定叫什么?我应该阅读什么以了解更多信息?
目前,我知道这被称为包含保护,以及与预处理器有关的东西。但我似乎无法进一步谷歌。任何链接将不胜感激。
包含保护实际上并不是语言本身的一个特性,它们只是一种确保同一个头文件不会两次包含在同一个翻译单元中的方法,它们是由低级语言特性构建的。
使这成为可能的实际功能是宏替换(特别是类似对象的宏)和条件包含。
因此,要找出它的FILE_H
来源,您需要检查两件事。
首先是标准施加的限制(C11 6.4.2
例如)。在宏替换中,宏名必须取自有限的字符集,最少包括大小写字母、下划线和数字(可以允许各种附加值,例如通用字符)名称或其他实现定义的字符,但这是强制性的基线)。
二是开发者的思想。除了标准的限制之外,开发人员必须提供一个用于包含保护的唯一标识符,最简单的方法是让它以某种方式依赖于文件名本身。因此,一种做法是使用大写文件名并.
替换为下划线。
这就是为什么你最终会得到一个包含保护btree.h
的形式:
#ifndef BTREE_H
#define BTREE_H
// weave your magic here
#endif
但是你应该记住,它并不总是很好。有时您可能会得到两个名称相似的头文件,它们使用相同的包含保护名称,从而导致根本不包含其中一个头文件。这种情况很少发生,通常不值得关注。