传统上,避免C ++中多个头部包含的标准和可移植方法是使用#ifndef - #define - #endif
预编译器指令方案,也称为macro-guard scheme(参见下面的代码片段)。
#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
...
#endif
在大多数实现/编译器中(见下图),有一个更“优雅”的替代方案,其作用与名为#pragma once
的宏保护方案相同。与宏保护方案相比,#pragma once
有几个优点,包括更少的代码,避免名称冲突,有时提高编译速度。
做了一些研究,我意识到虽然几乎所有已知的编译器都支持#pragma once
指令,但#pragma once
指令是否是C ++ 11标准的一部分仍然存在混淆。
#pragma once
指令是否属于C ++ 11标准吗?#pragma once
)的优缺点,也会很好。答案 0 :(得分:98)
#pragma once
不是标准。这是一种普遍的(但不是
通用)扩展,可以使用
它被认为是标准化,但因为它而被拒绝 无法可靠地实施。 (问题发生在你身上 有文件可通过几个不同的远程坐骑访问。)
确保没有包含警卫是相当容易的 单一发展中的冲突。对于图书馆,可能 被许多不同的发展所使用,显而易见的解决方案是 为包含守卫生成大量随机字符 当你创建它。 (可以设置一个好的编辑器来执行此操作 你何时打开一个新的标题。)但即使没有这个, 我还没有遇到任何冲突问题 库。
答案 1 :(得分:32)