#pragma once和#ifndef,#define,#endif都有防止头文件重复包含的作用。
所谓重复包含就是指在源文件中头文件被重复使用了同一个头文件(类似二次定义),造成冗余。
1. 程序员想出了利用#ifndef,#define,#endif防止重复包含
//a.h
#ifndef A_H
#define A_H
function1();
function2();
#endif A_H
//b.h
#include"a.h"
#ifndef B_H
#define B_H
function3();
function4();
#endif B_H
//main.app
#include"a.h"
#include"b.h"
int main()
{
function1();
function3();
return 0;
}
上述代码经过预处理(把头文件包含到源程序)后,得到如下语句:
#ifndef A_H
#define A_H
function1();
function2();
#endif A_H
#ifndef A_H
#define A_H
function1();
function2();
#endif A_H
#ifndef B_H
#define B_H
function3();
function4();
#endif B_H
int main()
{
function1();
function3();
return 0;
}
显然由于第二个的#ifndef A_H的条件不成立,所以就避免了a.h
头文件的重复包含。
但是这种方法也存在的明显的弊端:
其一,#ifndef的宏名要注意不能再次使用;其二,每次重复都要来判断,显然效率低下
2.随后出现了#pragma once解决了上述问题
//a.h
#pragma once
function1();
function2();
但#pragma once也非十全十美,一些较老的编译器并不支持。