101*_*010 137 c++ macros header-files c++11 c++14
传统上,避免C++中多个头部包含的标准和可移植方法是使用#ifndef - #define - #endif预编译器指令方案,也称为宏保护方案(参见下面的代码片段).
#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
...
#endif
Run Code Online (Sandbox Code Playgroud)
然而,在大多数实现/编译器中(见下图),有一个更"优雅"的替代方案,其功能与调用的宏保护方案相同#pragma once.#pragma once与宏保护方案相比具有几个优点,包括更少的代码,避免名称冲突,有时提高编译速度.

做了一些研究,我意识到尽管#pragma once几乎所有已知的编译器都支持指令,但是指令是否#pragma once是C++ 11标准的一部分还是存在紊乱.
#pragma once指令是否属于C++ 11标准的一部分吗?#pragma once)的优点/缺点,那也是很好的.Jam*_*nze 103
#pragma once是不是标准.它是一种广泛的(但不是通用的)扩展,可以使用
它被认为是标准化,但被拒绝,因为它无法可靠地实施.(当您通过多个不同的远程安装程序访问文件时会出现问题.)
确保在单个开发中不存在包含保护冲突是相当容易的.对于可能被许多不同开发项目使用的库,显而易见的解决方案是在创建包含防护时生成大量随机字符.(每当你打开一个新标题时,都可以设置一个好的编辑器为你做这个.)即使没有这个,我还没有遇到任何库之间冲突的问题.
Sho*_*hoe 32
标准第16.6节(N3936草案)将#pragma指令描述为:
表单的预处理指令
Run Code Online (Sandbox Code Playgroud)# pragma pp-tokensopt new-line导致实现以实现定义的方式运行.该行为可能导致转换失败或导致转换程序或生成的程序以不符合的方式运行.将忽略实现无法识别的任何编译指示.
基本上#pragma once是#pragma指令的实现特定实例,不,它不是标准的.然而.
它通常得到大多数"主要编译器"的广泛支持,包括GCC和Clang,因此有时建议避免使用包含防护装置.