防卫式声明

防卫式声明的一般模式是这样

#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之前的代码就不会执行,从而避免了重复定义的发生。

但是这里需要注意宏命名重名的问题。

 

posted on 2020-07-16 09:37  freden  阅读(303)  评论(0)    收藏  举报