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