防卫式声明
防卫式声明的一般模式是这样
#ifndef _FILENAME_ #define _FILENAME_ //... #endif
为什么要添加这个声明呢?
首先看一个头文件Car.h(没有防卫式声明)
// Car.h class Car { // ... };
第二个头文件Person.h,包含了Car.h
// Person.h #include "Car.h" class Person { public: Car car; };
在main.cpp里,我们同时包含两个头文件
// main.cpp #include "Car.h" #include "Person.h" int main(int argc, const char * argv[]) <br>{ Person p; }
此时,我们会发现编译出错:Redefinition of 'Car'.
可是为什么会出现这样的情况呢?
我们需要知道,在预编译阶段,编译器会把.h文件展开,即main.cpp中的代码可以看做是:
class Car { // ... }; class Car { // ... }; class Person { public: Car car; }; int main(int argc, const char * argv[]) { Person p; }
可以看到,car类被定义了两次。
所以,我们可以知道防卫式声明的作用是:防止由于同一个头文件被包含多次,而导致了重复定义。
#ifndef 依赖于宏定义名,当宏已经定义时,#endif之前的代码就会被忽略。
也就是说,ifndef成立,会走下面的代码,如果不成立,即该宏已经定义过了,endif之前的代码就不会执行,从而避免了重复定义的发生。
但是这里需要注意宏命名重名的问题。