C++中如何避免头文件包含问题
假设有一个名为“Head.h”的文件:
#include"Circle.h"
再有一个名为“TestHead.cpp”的文件:
#include"Circle.h"
#include"Head.h"
这个时候如果编译TestHead.cpp就会出现一个编译错误,指出Circle类有多个定义。这是因为,在C++中,预处理器是把头文件的内容插入它们包含的位置。Circle.h在上面第一行中被包含。由于Circle类的头文件也包含在Head.h中,而TestHead.cpp包含了Head.h,预处理器将再一次添加Circle类的定义,这会造成多次包含的错误。
在C++中,原语#ifndef
和#define
可以用来避免头文件被多次包含。
例子:
#ifndef CIRCLE_H
#define CIRCLE_H
class Circle
{
public:
Circle();
Circle(double);
~Circle(); // Destructor
double getArea() const;
double getRadius() const;
void setRadius(double);
private:
double radius;
};
#endif
由#开始的语句是预处理原语,它们由C++预处理器解释。#ifndef表示“如果没有定义”。第一行测试CIRCLE_H是否已经定义,如果没有,在第二行中用#define去定义该符号并且头文件的其他部分被包含进来;否则,头文件一下的部分将被忽略。#endif用于指出头文件结束。