C++ 如何定义头文件?为何要用到ifndef和#define,#endif?有何用

//b.h文件
#include "a.h"

//c.h文件
#include "a.h"
#include "b.h"

在c.h文件中,a.h文件被包含了两次.而C++规定在同一文件中只能将同一个头文件包含一次.#ifndef,#define,#endif可以避免多次包含同一头文件.

//新的c.h文件
#ifndef C_H_H
#define C_H_H
#include "a.h"
#include "b.h"
...
#endif

编译器连接c.h文件时,第一次遇到a.h文件,名称C_H_H还没有被定义,编译器将查看#ifndef和#endif之间的内容.如果在同一文件中遇到其他包含a.h的代码,编译器将知道C_H_H名称已经被定义了,从而忽略其中的内容.
假如头文件文件名为head.h,则在头文件开头一般会定义:
#ifndef HEAD_H
#define HEAD_H
文件末尾添加
#endif

头文件可以通过#include"head.h"来包含,编译器预处理时,将该文件在此处展开。如果没有使用#ifndef、#define、#endif,程序有可能出现重复包含的可能。通过简单的预处理命令,可以有效的接触重复包含的问题,同时降低了编译器的负担,提高了编译效率。
#include // 系统库文件
#include "XXXXX.h" // 系统库文件,或自定义头文件
或者:
#include
#include "XXXXX"
useing using namespace std;

用ifndef和#define,#endif的目的是为了防止某个文件被多次#include。
以上答案是基于VC做出的。