使用#ifndef和#define是否会改变内存分配?

时间:2016-01-06 11:20:11

标签: c

我最近看到了一个带有这样定义的头文件:

#ifndef DEFINE_ME
#define DEFINE_ME     1
     char abc[10];
#endif

但我也发现DEFINE_ME从未在项目的任何其他头文件中定义,为什么#ifndef被使用?是否必须对记忆做任何事情?

2 个答案:

答案 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

现在你已经使用了一个警卫,所以你错误地在同一个项目的不同文件中包含相同的标题,那么你也会安全。