#include guards VS. #pragma once
2010-08-26 16:20
302 查看
1. #include guards
#include guards是一种很常用的方法。
VC自动生成的使用MFC的文件会使用宏名类似"AFX_XXX_H__XXX__INCLUDED_"的#include guards。(VS用的是#pragma once)
优点:
●对于多个头文件,可以只包含其中一个(比如,完全相同的两个文件)
●可以针对文件中的一段代码
缺点:
●存在宏名冲突的隐患,造成不可预知的结果(比如,和第三方工具)
2. #pragma once
#pragma once是非标准的,但编译器普遍支持的命令。
优点:
●避免宏名冲突(name clash)
●编译速度快(但有些编译器,如GCC,对#include guards会进行优化处理。这样,#pragma once的这一优点就不是很明显了。)
●较少的代码
缺点:
●依赖于编译器对#pragma once的处理是否正确
●必须针对整个文件
3. 两者结合
缺点:
●无法避免宏名冲突
●无法避免不支持#pragma once的编译报错
于是没什么必要写成这样。
#ifndef GRANDFATHER_H #define GRANDFATHER_H //TODO: ... #endif //GRANDFATHER_H
#include guards是一种很常用的方法。
VC自动生成的使用MFC的文件会使用宏名类似"AFX_XXX_H__XXX__INCLUDED_"的#include guards。(VS用的是#pragma once)
优点:
●对于多个头文件,可以只包含其中一个(比如,完全相同的两个文件)
●可以针对文件中的一段代码
缺点:
●存在宏名冲突的隐患,造成不可预知的结果(比如,和第三方工具)
2. #pragma once
#pragma once //TODO: ...
#pragma once是非标准的,但编译器普遍支持的命令。
优点:
●避免宏名冲突(name clash)
●编译速度快(但有些编译器,如GCC,对#include guards会进行优化处理。这样,#pragma once的这一优点就不是很明显了。)
●较少的代码
缺点:
●依赖于编译器对#pragma once的处理是否正确
●必须针对整个文件
3. 两者结合
#pragma once #ifndef GRANDFATHER_H #define GRANDFATHER_H //TODO: ... #endif // GRANDFATHER_H
缺点:
●无法避免宏名冲突
●无法避免不支持#pragma once的编译报错
于是没什么必要写成这样。
相关文章推荐
- Include Guards: #ifndef vs #pragma once
- #pragma once VS #ifndef的方式
- 如何确定VS编译器版本--_MSC_VER || #if _MSC_VER > 1000 #pragma once #endif
- pragma once VS ifndef define endif
- #pragma once与 #ifndef的区别
- C++—— #ifndef 和 #pragma once 区别
- #pragma once 与 #ifndef 解析
- #pragma once与 #ifndef的区别
- C++ #pragma once与 #ifndef的区别
- Include,require,include_once,require_once的区别
- 今天终于知道了pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别
- #pragma once与 #ifndef的区别
- #pragma once与 #ifndef的区别
- php中用require、require_once、include、include_once
- (转)#pragma once和#ifndef的区别
- #pragma once与 #ifndef的区别
- 简单谈谈PHP中的include、include_once、require以及require_once语句
- include()与require()的区别及require_once的代价
- #pragma once 与 #ifndef 区别
- #pragma once