假设我有一个带有函数定义的头文件“header.h”。
#ifndef HEADER_FILE
#define HEADER_FILE
int two(void){
return 2;
}
#endif
这个头文件有一个包含保护。但是,我对#define HEADER_FILE 实际上在做什么感到困惑。假设我忘记了 include 保护,完全忽略添加“#define HEADER_FILE”对我来说是完全合法的。
当我们定义 HEADER_FILE 时,我们究竟在做什么?我们在定义什么?为什么可以忘记包含防护,在这种情况下我们也可以忘记添加#define HEADER_FILE?
最佳答案
这是一个预处理器宏。
所有这些都是预处理器语法,基本上就是说,如果这个宏还没有被定义,定义它并包含 #ifndef
和 #endif
之间的所有代码
它的作用是防止多次包含文件,这可能会导致您的代码出现问题。
您的问题:
And why is it okay to forget the include guard in which case we can also forgot adding #define HEADER_FILE?
忘记它没关系,因为没有它它仍然是合法的 C 代码。预处理器在编译之前处理您的文件,如果没有逻辑说明为什么不应该在最终程序中包含指定的代码。这只是一种常见做法,但不是必需的。
一个简单的例子可能有助于说明这是如何工作的:
我们会说您的头文件 header_file.h
包含以下内容:
#ifndef HEADER_FILE
#define HEADER_FILE
int two(void){
return 2;
}
#endif
在另一个文件 (foo.c
) 中,您可能有:
#include "header_file.h"
void foo() {
int value = two();
printf("foo value=%d\n", value);
}
一旦“预处理”并准备好编译,这将转化为:
int two(void){
return 2;
}
void foo() {
int value = two();
printf("foo value=%d\n", value);
}
include guard 在这里完成的所有工作是确定是否应该粘贴 #ifndef ...
和 #endif
之间的 header 内容来代替原始内容#include
。
但是,由于该函数未声明为 extern
或 static
,并且实际上是在头文件中实现的,因此如果您尝试使用它就会遇到问题在另一个源文件中,因为不会包含函数定义。
关于c - C include guards到底做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27810115/