说明#ifndef与#pragma once区别

今早解决了#ifndef#pragma once之间区别的疑惑。

为了区别#ifndef#pragma once的宏定义区别,为此我特意编了点小程序测试了下,过程如下:

1、创建两个头文件Huang1.hHuang2.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值