传统上,避免 C++ 中包含多个标头的标准且可移植的方法是使用
#ifndef - #define - #endif
预编译器指令方案,也称为 宏保护方案(请参阅下面的代码片段)。
#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
),那就太好了。#pragma once
是不是 标准。这是一种广泛传播的现象(但并非
通用)扩展,可以使用
曾考虑标准化,但被拒绝,因为它 无法可靠地实施。 (当您 可以通过几个不同的远程安装访问文件。)
确保没有包含防护是相当容易的 单一开发中的冲突。对于图书馆来说,可能 被许多不同的开发使用,明显的解决方案是 为包含防护生成大量随机字符 当你创建它时。 (可以设置一个好的编辑器来执行此操作 每当你打开一个新标题时。)但即使没有这个, 我还没有遇到任何冲突的问题 图书馆。