#ifndef 头文件卫士 只防止一个.cpp里的重定义(因为#define只作用于一个.cpp),而不是多个.cpp

#ifndef 头文件卫士是为了保证类的头文件在一个.cpp文件中被多次引用后会不会出现重复定义的问题,注意,只是防止在一个.cpp文件中被多次引用.

 

 

#ifndef ELEMTYPE_H

#define ELEMTYPE_H

的意思是,如果前面没有定义ELEMTYPE_H,那么现在定义ELEMTYPE_H

它不需要有值,只是表明是否被定义过,它是为了防止头文件的重复定义

 

我举个简单的例子帮助你理解:

 

你在a.h里定义了一个类a:

 

class a{

 

}

 

然后在b.h里定义了一个类b,而且引用了a.h:

 

#include "a.h"

 

class b{

 

}

 

编译器在编译时,b.h的实际内容为:

 

class a{

 

}

 

class b{

 

}

 

这里还没出现错误。

 

 

然后你在c.cpp里引用了a.hb.h:

 

#include "a.h"

 

#include "b.h"

 

那么,编译器在编译的时候会把a.hb.h里的内容原封不动的填进来以代替这两句,这样c.cpp就变为:

 

class a{

 

}

 

class a{

 

}

 

class b{

 

}

 

你可以很清楚的看到,类a重定义了。

 

那么,如果我们用到前面提到的宏定义来分别定义a.hb.h如下:

 

//a.h

 

#ifndef A_H

 

class a{

 

}

 

#define A_H

 

 

//b.h

 

#ifndef B_H

 

class b{

 

}

 

#define B_H

 

 

那么,c.cpp展开后为:

 

#ifndef A_H

 

class a{

 

}

 

#define A_H

 

 

 

#ifndef B_H

 

  #ifndef A_H

 

    class a{

 

    }