#ifndef是宏定义里面的一种,用来防止防止头文件的重复包含和编译。
比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。
如果把头文件的内容都放在#ifndef和#endif中,不管你的头文件会不会被多个文件引用,你都要加上这个,就可以避免冲突的问题。
#ifndef可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的一种——条件编译。 C语言在对程序进行编译时,会先根据预处理命令进行“预处理”。C语言编译系统包括预处理,编译和链接等部分。
扩展资料:
#ifndef一般格式是这样的:
#ifndef <标识>
#define <标识>
......
#endif
<标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h
#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif
参考资料来源:百度百科-#ifndef
#ifndef _a_h//判断是否已经定义了,没定义的话则有以下定义#define _a_h
//头文件内容
#endif
每个CPP文件是一个最小编译单位,用到输出流对象,当然应该包含相应的头文件,所以应加上#include<iostream>
写在你防止重复定义的那个头文件里
是为了防止重复包含,产生重定义的问题。因为头文件实在太多了,而且头文件又包含头文件,比如你include头文件a.h, 但其实它在前面你用过的头文件x.h已经包含过了,但你又不知道,这样编译会产生太多重复包含,重定义的错误,如果包含头文件太多,层次太深,排除错误几乎是难以完成的。 但如果你在每个头文件里都有个#ifndef Xxx
#define Xxx
编译器只考虑最一开始包含那个头文件,后面通过其它渠道包含的相同头文件,因为宏xxx已经定义过,就不再解析这个头文件了。所以,就不会产生重定义问题,又会使头文件中的定义正好发生一次作用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)