1

在 C 语言中,我们可以包含一个文件为#include "filename.h"
But 例如,如果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

4 回答 4

1

否 - 除非您用于保护宏的名称与文件名完全匹配,否则不会。例如,您可以包含这样的文件:

#define filename <stdio.h>
#include filename

filename被宏替换,因此结果相当于:

#include <stdio.h>

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

于 2012-11-27T06:16:36.097 回答
0

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

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

而且,从您的警告信息来看,您的实施也没有这样做。

于 2012-11-27T06:15:55.077 回答
0

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

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

于 2012-11-27T06:17:34.507 回答
0

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

你可以写:

#define MAGIC_HEADER "magic.h"
#include MAGIC_HEADER

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

于 2012-11-27T06:21:30.390 回答