[C++]关于头文件中的防卫式声明(#ifndef...#pragma once)
2017-04-20 08:53
218 查看
转自http://www.cnblogs.com/xyq10612/p/5910933.html
[C++]关于头文件中的防卫式声明(#ifndef...#pragma once)
大家知道,我们写.h文件时,通常会加上防卫式声明,有以下两种方式:
1. 宏定义
?
2. 编译器指令
?
但是,为什么头文件中需要添加这种防卫式声明呢?如果没有这样的声明,会出现怎样的问题。这里,先看一个例子。
-- "Car.h",代码如下(并没有添加防卫式声明):
?
-- "Person.h",代码如下(包含了Car.h文件):
?
-- 在"main.cpp"中,我们同时include两个头文件:
?
此时,我们会发现编译出错:Redefinition of 'Car'.
可是为什么会出现这样的情况呢?
我们需要知道,在预编译阶段,编译器会把.h文件展开,即main.cpp中的代码可以看做是:
?
所以,我们可以知道防卫式声明的作用是:防止由于同一个头文件被包含多次,而导致了重复定义。
在这两种声明方式中:
#ifndef 依赖于宏定义名,当宏已经定义时,#endif之前的代码就会被忽略,但是这里需要注意宏命名重名的问题;
#pragma once 只能保证同一个文件不会被编译多次,但是当两个不同的文件内容相同时,仍然会出错。而且这是微软提供的编译器命令,当代码需要跨平台时,需要使用宏定义方式。
[C++]关于头文件中的防卫式声明(#ifndef...#pragma once)
大家知道,我们写.h文件时,通常会加上防卫式声明,有以下两种方式:
1. 宏定义
?
?
但是,为什么头文件中需要添加这种防卫式声明呢?如果没有这样的声明,会出现怎样的问题。这里,先看一个例子。
-- "Car.h",代码如下(并没有添加防卫式声明):
?
?
?
可是为什么会出现这样的情况呢?
我们需要知道,在预编译阶段,编译器会把.h文件展开,即main.cpp中的代码可以看做是:
?
在这两种声明方式中:
#ifndef 依赖于宏定义名,当宏已经定义时,#endif之前的代码就会被忽略,但是这里需要注意宏命名重名的问题;
#pragma once 只能保证同一个文件不会被编译多次,但是当两个不同的文件内容相同时,仍然会出错。而且这是微软提供的编译器命令,当代码需要跨平台时,需要使用宏定义方式。
相关文章推荐
- c++头文件包含 #ifndef ##pragma once
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- 关于前置声明与C++中头文件相互包含的几点问题
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- 头文件中ifndef/define/endif的作用以及#pragma once使用
- C++ 防止头文件被重复包含(#pragma once 与 #ifndef 的区别)
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- C++ 关于声明,定义,类的定义,头文件作用,不具名空间
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- 关于头文件定义中#ifdef,#define,#endif和#pragma once的区别
- 关于C++头文件互引用和前向声明
- 关于前置声明与C++中头文件相互包含的几点问题
- c++ 避免头文件重复引用 (pragma once与 #ifndef的区别)
- 关于使用#pragma once与#ifndef ___FILE_NAME__H避免文件被多次包含的区别
- C++ 关于声明,定义,类的定义,头文件作用,内、外链接
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- #pragma once&&#ifndef解释:头文件只被编译一次
- 关于前置声明与C++中头文件相互包含的几点问题
- c++ 避免头文件重复引用 (pragma once与 #ifndef的区别)【转】
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间