Izz*_*zzo 6 c macros include-guards header-files c-preprocessor
我有一个关于在C中包含警卫的问题.我已经做了一些阅读,但我会欣赏一点澄清.
假设我有一个带有函数定义的头文件"header.h".
#ifndef HEADER_FILE
#define HEADER_FILE
int two(void){
return 2;
}
#endif
Run Code Online (Sandbox Code Playgroud)
这个头文件有一个包含保护.但是,我对#define HEADER_FILE实际上在做什么感到困惑.假设我忘记了包含守卫,完全忽略添加'#define HEADER_FILE'对我来说是完全合法的.
所以我的问题是:当我们定义HEADER_FILE时,我们到底在做什么?我们定义了什么?为什么忘记包含警卫是可以的,在这种情况下我们也忘了添加#define HEADER_FILE?
任何帮助表示赞赏!
Rya*_*n J 14
它是一个预处理器宏.
所有这些都是预处理器语法,基本上说,如果尚未定义此宏,则定义它并包含#ifndef和之间的所有代码.#endif
它实现的目的是防止多次包含文件,这可能会导致代码出现问题.
你的问题:
为什么忘记包含警卫是可以的,在这种情况下我们也忘了添加#define HEADER_FILE?
忘记它是可以的,因为没有它它仍然是合法的C代码.预处理器在编译之前处理您的文件,如果没有逻辑指定不应该的原因,则在最终程序中包含指定的代码.这只是一种常见做法,但并不是必需的.
一个简单的例子可能有助于说明其工作原理:
header_file.h我们会说,您的头文件包含:
#ifndef HEADER_FILE
#define HEADER_FILE
int two(void){
return 2;
}
#endif
Run Code Online (Sandbox Code Playgroud)
在另一个文件(foo.c)中,您可能有:
#include "header_file.h"
void foo() {
int value = two();
printf("foo value=%d\n", value);
}
Run Code Online (Sandbox Code Playgroud)
一旦它被"预处理"并准备好编译,这将转化为:
int two(void){
return 2;
}
void foo() {
int value = two();
printf("foo value=%d\n", value);
}
Run Code Online (Sandbox Code Playgroud)
所有包括守卫在这里完成的是确定是否应该粘贴#ifndef ...和之间的标题内容#endif来代替原始标题#include.
然而,由于该功能未声明extern或static,而实际上是在头文件中实现,你会如果你试图在另一个源文件中使用它,因为函数定义将不包括有问题.
您可以在此处阻止文件被多次包含
#ifndef HEADER_FILE
Run Code Online (Sandbox Code Playgroud)
你测试是否HEADER_FILE未定义,如果是真的那么
#define HEADER_FILE
Run Code Online (Sandbox Code Playgroud)
现在,如果你将文件包含在另一个文件中,第一次定义HEADER_FILE,第二次,它将被定义,因此文件的内容不再包括在内,因为#ifndef HEADER_FILE它将是假的.
请记住,这些是在实际编译完成之前由预处理器评估的,因此它们在编译时进行评估.
| 归档时间: |
|
| 查看次数: |
11463 次 |
| 最近记录: |