#ifndef #define #endif使用详解

#ifndef _STDAFX_H  
#define _STDAFX_H  

#include<iostream.h>         //cin  cout  
#include<malloc.h>           //malloc  free  
#include<string.h>           //strcpy  
#include<stdlib.h>           //exit()  

#endif  

1. 内容:

在头文件(如:StdAfx.h)开头写上两行:

#ifndef _STDAFX_H  
#define _STDAFX_H  //一般是文件名的大写  

头文件结尾写上一行:

#endif  

2. 作用:

主要目的是防止头文件的重复包含和编译。

例如:假设你的工程里面有4个文件,分别是 a.cpp , b.h, c.h, d.h。
a.cpp的头部是:

#include "b.h"   
#include "c.h"  

b.h和c.h的头部都是:

#include "d.h"  

而d.h里面有 a的定义int a; (这里讲得不好,因为不要将变量声明放在头文件中。可以改为结构体的声明):

struct v
{
    int a;
};

这样一来, 编译器编译a.cpp的时候,先根据#include “b.h”去编译b.h这个文件,再根据b.h里面的#include “d.h “,去编译d.h的这个文件,这样就把d.h里面的struct v编译了; 然后再根据a.cpp的第二句#include “c.h “,去编译c.h,最终还是会找到的d.h里面的struct v,但是struct v之前已经编译过了,所以就会报重定义错误。
加上ifndef/define/endif,就可以防止这种重定义错误。

3. ifndef/define/endif如何防止头文件的重复包含和编译?

编译器首次(即在b.h中)遇到文件d.h(定义为:#define D_H_)时,名称D_H_没有定义。这种情况下,编译器将查看#ifndef和#endif之间的内容,并读取定义D_H_的一行。如果在同一个文件中(a.cpp文件)遇到其它包含d.h的代码(即在c.h中),编译器知道D_H_已经被定义了,从而跳到#endif后面的一行上。

注意:这种方法并不能防止编译器将文件包含两次,而只是让它忽略除第一次包含之外的内容。

大多数标准C和C++头文件都使用这种防护方案。否则,可能在一个文件中定义同一个结构两次,这将导致编译错误。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值