传统上,避免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标准吗? - 如果它不是C ++ 11标准的一部分,是否有任何计划将其包含在更高版本中(例如C ++ 14或更高版本)?
- 如果有人可以进一步详细说明使用这两种技术中的任何一种(例如,宏观卫士与
#pragma once
)的优势/劣势,那也很好。
9
顺便说一句,该标准禁止将双下划线用作标头保护符,该规范为实现保留所有以双下划线开头的符号(其他符号除外)。
—
Matteo Italia
也禁止使用前划线和大写字母。第二,浑浊在哪里?我只是看到编译器支持,没有人声称它是标准的一部分?
—
Yakk-Adam Nevraumont 2014年
对于第三个要点,请看一个相关的问题:#pragma曾经是一个安全的包括门卫吗?在这种情况下,标头警卫工作了,但
—
user1942027
#pragma once
通常不起作用。
可能的重复之处在于它回答了这个问题,而没有提及C ++ 11。
—
Yakk-Adam Nevraumont 2014年
嗯,它没有在任何正式文档中编码,但是您可以将其视为事实上的标准。
—
任思远2014年