博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[C++]关于头文件中的防卫式声明
阅读量:5091 次
发布时间:2019-06-13

本文共 1101 字,大约阅读时间需要 3 分钟。

大家知道,我们写.h文件时,通常会加上防卫式声明,有以下两种方式:

1. 宏定义

1
2
3
4
#ifndef _FILENAME_
#define _FILENAME_
//...
#endif

2. 编译器指令

1
#pragma once

  

但是,为什么头文件中需要添加这种防卫式声明呢?如果没有这样的声明,会出现怎样的问题。这里,先看一个例子。

-- "Car.h",代码如下(并没有添加防卫式声明):

1
2
3
4
5
// Car.h
class 
Car
{
// ...
};

-- "Person.h",代码如下(包含了Car.h文件):

1
2
3
4
5
6
7
// Person.h
#include "Car.h"
class 
Person
{
public
:
    
Car car;
};

-- 在"main.cpp"中,我们同时include两个头文件:

1
2
3
4
5
6
// main.cpp
#include "Car.h"
#include "Person.h"
int 
main(
int 
argc, 
const 
char 
* argv[]) <br>{
    
Person p;
}

此时,我们会发现编译出错:Redefinition of 'Car'.

可是为什么会出现这样的情况呢?

我们需要知道,在预编译阶段,编译器会把.h文件展开,即main.cpp中的代码可以看做是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class 
Car
{
    
// ...
};
 
class 
Car
{
    
// ...
};
 
class 
Person
{
public
:
    
Car car;
};
 
int 
main(
int 
argc, 
const 
char 
* argv[]) {
    
Person p;
}

所以,我们可以知道防卫式声明的作用是:防止由于同一个头文件被包含多次,而导致了重复定义。

在这两种声明方式中:

  #ifndef 依赖于宏定义名,当宏已经定义时,#endif之前的代码就会被忽略,但是这里需要注意宏命名重名的问题;

  #pragma once 只能保证同一个文件不会被编译多次,但是当两个不同的文件内容相同时,仍然会出错。而且这是微软提供的编译器命令,当代码需要跨平台时,需要使用宏定义方式。

 

https://www.cnblogs.com/xyq10612/p/5910933.html

转载于:https://www.cnblogs.com/swefii/p/10505674.html

你可能感兴趣的文章
杭州电子科技大学2018年自命题科目考试大纲(数据结构与组成原理)
查看>>
Intellij IDEA 14 JRebel6.0.2 安装
查看>>
centos7 防火墙相关命令
查看>>
学习心情
查看>>
PS制作gif动图以及背景透明与消除残影
查看>>
A - Beautiful Meadow
查看>>
Asteroids(二分图最大匹配模板题)
查看>>
C#导出Excel
查看>>
如何使用express搭建一个网站
查看>>
j.u.c系列(07)---之读写锁:ReentrantReadWriteLock
查看>>
RelativeLayout和layout_weight的异曲同工之妙(转载)
查看>>
Spring Test
查看>>
centos7 防火墙屏蔽IP
查看>>
如何学习一个新框架
查看>>
Code First 发生的错误 Type is not resolved for member
查看>>
Memcached 管理与监控工具 MemAdmin
查看>>
扩展方法
查看>>
[bash] string operators
查看>>
高并发高性能
查看>>
jvm的那些设置参数你都知道吗
查看>>