说明:
#ifndef XXXX
#define XXXX
#endif
字面意思
1:#ifndef 如果没有定义后面的宏XXXX,执行2 。如果#ifndef 如果有定义后面的宏,执行3
2 #define 执行3
3 #endif
作用:
1:防止重复引用(重复引用会导致编译效率低)。
2:防止头文件内容被重复包含和编译。 头文件重复包含会增大程序大小,重复编译增加编译时间。
解释:#ifndef
起到的效果是防止一个源文件多次包含同一个头文件
示例 不用#ifndef #define #endif
a.h
#include"b.h"
#define A 1
b.h
#include "a.h"
#define B 2
main.cpp
#include<iostream>
#include"a.h"
#include"b.h"
int main()
{
return 0;
}
编译运行 会报错
In file included from b.h:1:0,
from a.h:1,
from b.h:1,
......
from b.h:1,
from a.h:1,
from main.cpp:2:
a.h:1:14: error: #include nested too deeply
#include"b.h"
^
In file included from a.h:1:0,
from b.h:1,
from a.h:1,
.........
from b.h:1,
from a.h:1,
from b.h:1,
from main.cpp:3:
b.h:1:14: error: #include nested too deeply
#include"a.h"
分析原因
main.cpp中包含了两个头文件a.h 和b.h
a.h中包含了头文件b.h
b.h中包含了头文件a.h
编译器预编译时候 就会形成一个死循环 a.h和b.h在一直循环引用
造成nested too deeply(嵌套太深)
示例 用#ifndef #define #endif
修改头文件
a.h
#ifndef __A_H_
#define __A_H_
#include"b.h"
#define A 2
#endif
b.h
#ifndef __B_H_
#define __B_H_
#include"a.h"
#define B 2
#endif
main.cpp
#include<iostream>
#include"a.h"
#include"b.h"
int main()
{
return 0;
}
编译运行通过
原因分析
1 字面意思 #ifndef 如果没有定义后面的宏,执行2 。如果#ifndef 如果有定义后面的宏,执行3
2 #define 执行3
3 #endif
备注:#define 标识 应该是唯一的, 一般以头文件名字大写加上下划线和大写的H构成。
一般头文件不要定义变量,只做声明(重复引用就会有重定义)
指令 #ifdef 和 #else #endif
#include<iostram>
#define TEST_CODE
int main()
{
int a 10;
#ifdef TEST_CODE
a =10;
#else
a = 100;
#endif
return 0;
}