今早解决了#ifndef与#pragma once之间区别的疑惑。
为了区别#ifndef与#pragma once的宏定义区别,为此我特意编了点小程序测试了下,过程如下:
1、创建两个头文件Huang1.h和Huang2.h,如下:
//Huang1.h
#include <iostream.h>
#ifndef HH
#define HH 100
#endif
void Fanh()
{
cout<<HH*2<<endl;
}
//Huang2.h
#pragma once
#include <iostream.h>
void Fan()
{
cout<<"good"<<endl;
}
2、再创建一个cpp文件Huang.cpp,如下:
#include <iostream.h>
#include "Huang1.h"
#include "Huang1.h"
#include "Huang2.h"
#include "Huang2.h"
void main()
{
Fan();
Fanh();
}
3、运行,出错如下:
--------------------Configuration: eaxm - Win32 Debug--------------------
Compiling...
Huang.cpp
d:/vc实战演练/eaxm/huang1.h(6) : error C2084: function 'void __cdecl Fanh(void)' already has a body
从以上可以看出重复调用函数体,因为前面两次包括头文件Huang1.h,于是注释掉红色字的头文件,
#include <iostream.h>
#include "Huang1.h"
//#include "Huang1.h"
#include "Huang2.h"
#include "Huang2.h"
void main()
{
Fan();
Fanh();
}
再运行,结果为:good
200
press any key to continute
说明结果是对的。
4、但是为什么两次"Huang2.h"都不会出问题呢?这恰恰说明了一个问题
#pragma once则由编译器提供保证:同一个文件不会被包含多次。也就是说第一次打开Huang2.h之后,下一次就不会再打开Huang2.h了,此时运行到第二次"Huang2.h"时就会跳过,而Huang1.h会重复多次打开,所以你就会发现调用了多个函数体,也就会出现上面的错误。。
参考:http://mxdxm.javaeye.com/blog/592542
http://www.cppblog.com/szhoftuncun/archive/2007/10/28/35356.html