#ifndef #define #endif使用详解

#ifndef _STDAFX_H  
#define _STDAFX_H  

#include         //cin  cout  
#include           //malloc  free  
#include           //strcpy  
#include           //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++头文件都使用这种防护方案。否则,可能在一个文件中定义同一个结构两次,这将导致编译错误。

你可能感兴趣的:(VS编程技巧(C/C++))