我最近看到了一个带有这样定义的头文件:
#ifndef DEFINE_ME
#define DEFINE_ME 1
char abc[10];
#endif
但我也发现DEFINE_ME从未在项目的任何其他头文件中定义,为什么#ifndef被使用?是否必须对记忆做任何事情?
答案 0 :(得分:2)
它被称为include guard
.
DEFINE_ME
的目的是防止意外地多次包含特定(在其定义的位置)头文件。
要了解它是如何工作的,请尝试不包括后卫:
header.h:
int x = 5;
file.c:
#include "header.h"
#include "header.h"
int main() {
printf("%d\n", x);
}
然后尝试使用包含守卫:
header.h:
#ifndef DEFINE_ME
#define DEFINE_ME 1
int x = 5;
#endif
file.c:
#include "header.h"
#include "header.h"
int main() {
printf("%d\n", x);
}
当您有DEFINE_ME
时,标头将首次包含在fil.c
中,header.h
包含在DEFINE_ME
之前未定义。但是下一个#include "header.h"
不会包含警卫的内容,因为DEFINE_ME
已经被之前的包含所定义。
答案 1 :(得分:1)
包括警卫。
这样做的目的是防止多次声明变量。
ifndef =如果没有定义。 然后定义它.. 如果已定义,则使用上一个声明..
假设你有两个头文件
头1:
#ifndef DEFINE_ME
#define DEFINE_ME 1
#endif
标题2:
#ifndef DEFINE_ME
#define DEFINE_ME 1
#endif
现在如果首先包含c文件头2,那么它将包含头2中的值而不是头1中的值..因为它已在头2中定义
您也可以使用头文件保护,如下所述:
那么header1.h
#ifndef _header1
#define _header1
#ifndef VAR1
#ifdef VAR1 5
#endif
#endif
Header2.h
#ifndef _header2
#define _header2
#ifndef VAR1
#ifdef VAR1 5
#endif
#endif
现在你已经使用了一个警卫,所以你错误地在同一个项目的不同文件中包含相同的标题,那么你也会安全。