文件包含头文件保护而不是文件可能在C?

时间:2012-11-27 06:08:37

标签: c

在C中,我们可以将文件包含为#include "filename.h"
但是,例如,如果filename.h的内容为 -

#ifndef FILE_NAME_GUARD

#define FILE_NAME_GUARD

//contents
.
.
.

在我的另一个文件中,我可以将上述文件包含为#include <FILE_NAME_GUARD>而不是#include "filename.h"吗?

我试过这种方式,我很惊讶地看到没有编译器错误或链接器错误。但是有这个警告:

FILE_NAME_GUARD: No such file or directory

请帮助澄清我们是否可以包含带有multiple_header_guard名称的标头而不是文件名?

4 个答案:

答案 0 :(得分:1)

否 - 除非用于保护宏精确的名称与文件名匹配。例如,您可以包含如下文件:

#define filename <stdio.h>
#include filename

filename将被宏替换,因此结果等同于:

#include <stdio.h>

因此,如果您使用了与要包含的文件名称精确匹配的标头保护宏(包括引号或尖括号),您可以使其工作 - 但否则它将失败。我不认为以这种方式编写代码是个好主意。在大多数情况下,它似乎毫无意义 - 只有在已经包含该标题时才会定义标题保护宏,这正是您(通常)不想包含它的情况。

答案 1 :(得分:0)

实际上,include语句中<>""之间发生的事情几乎完全是实现定义的,所以你不能肯定地说。

从技术上讲,一个实现可以记住哪个包含文件映射到哪个防护名称并智能地处理它,但我从未在野外看到过。

而且,根据您的警告消息判断,您的实施也不会这样做。

答案 2 :(得分:0)

  

请帮助澄清我们是否可以在其中包含带有multiple_header_guard名称的标题而不是文件名?

不,你不能,因为预处理器不是魔法。

答案 3 :(得分:0)

您无法通过其标头保护宏真正包含文件。通常,标头保护宏被定义为空字符串,并且很难包含由空字符串命名的文件。

你可以写:

#define MAGIC_HEADER "magic.h"
#include MAGIC_HEADER

#include之后使用的宏与其中一种格式"name"<name>匹配。但是,使用标头守卫尝试这一点毫无意义。在定义标题保护宏时,您已经包含了该文件,并且不想再次这样做(在<assert.h>点头,可以多次包含,每次都有不同的效果,具体取决于是否定义了NDEBUG宏。)