有时候我们在编译程序时会遇到‘class’ type redifintion这样的报错。这有可能就是我们碰到了头文件重复包含的问题了。
比如我们编写这样几个类:
class animal
{
//.....
}
//fish.h
#include "animal.h" //因为fish是从animal派生而来的,因此要包含animal.h这个头文件
class fish:public animal
{
//.......
}
//test.cpp 测试问题
#include "animal.h"
#include "fish.h"
void main()
{.....}
当我们编译这个test.cpp文件的时候,就会报重定义错误。原因是这个文件包含了animal.h与fish.h两个头文件。当编译器编译test.cpp文件时,首先会遇到animal.h这个头文件,于是编译器就会将这个头文件展开,就可以识别animal这个类了;将animal.h这个头文件展开后,编译器就会遇到fish.h这个头文件,编译器同样会将这个文件展开,但是不同的是,这个fish.h头文件里面也包含了animal.h这个头文件,于是编译器就会再次展开这个animal.h头文件。。。这样问题就出现了,两次展开同一个头文件animal.h,这样就相当于animal这个类定义两次的情况,自然就会报错了。
解决这个问题的方法就是采用预处理指令,具体如下:
//animal.h
#ifndef ANIMAL_H_H
#define ANIMAL_H_H
class animal
{//....}
#endif
//fish.h
#include "animal.h"
#ifndef FISH_H_H
#define FISH_H_H
calss fish:public animal
{//.....}
#endif
这样以后再重新编译test.cpp文件看看,应该就不会出现重复包含头文件导致的错误了。