实现定义行为控制
实现定义行为由 #pragma 指令控制。
目录 |
[编辑] 语法
#pragma pragma-params |
(1) | ||||||||
_Pragma( string-literal ) |
(2) | (自 C++11 起) | |||||||
L
前缀(如果有)、外层引号以及前导/尾随空格,将每个 \" 替换为 ",并将每个 \\ 替换为 \,然后对结果进行标记化处理(如 翻译阶段 3 中所述),然后将结果用作 (1) 中 #pragma 的输入。[编辑] 解释
Pragma 指令控制编译器实现特定的行为,例如禁用编译器警告或更改对齐要求。 任何无法识别的 pragma 都将被忽略。
[编辑] 非标准 pragma
ISO C++ 语言标准不要求编译器支持任何 pragma。 然而,多种实现都支持一些非标准 pragma
[编辑] #pragma STDC
ISO C 语言标准要求 C 编译器支持以下三个 pragma,一些 C++ 编译器供应商也在其 C++ 前端中不同程度地支持它们
#pragma STDC FENV_ACCESS arg |
(1) | ||||||||
#pragma STDC FP_CONTRACT arg |
(2) | ||||||||
#pragma STDC CX_LIMITED_RANGE arg |
(3) | ||||||||
其中 arg 是 ON
、OFF
或 DEFAULT
之一。
ON
,则通知编译器程序将访问或修改 浮点环境,这意味着禁止进行可能破坏标志测试和模式更改的优化(例如,全局公共子表达式消除、代码移动和常量折叠)。 默认值由实现定义,通常为 OFF
。ON
。+v2
), 和 |x+iy| = √x2
+y2
,尽管可能发生中间溢出。 换句话说,程序员保证传递给这些函数的值的范围是有限的。 默认值为
OFF
。如果以上三个 pragma 中的任何一个出现在所有外部声明之外的任何上下文中,或者出现在复合语句内所有显式声明和语句之前,则程序的行为是未定义的。
注意:不支持这些 pragma 的编译器可能会提供等效的编译时选项,例如 gcc 的 -fcx-limited-range
和 -ffp-contract
。
[编辑] #pragma once
#pragma once 是一个非标准 pragma,被 绝大多数现代编译器 支持。 如果它出现在头文件中,则表示即使在同一源文件中多次(直接或间接)包含它,也只应解析一次。
防止多次包含同一头文件的标准方法是使用 包含保护
#ifndef LIBRARY_FILENAME_H #define LIBRARY_FILENAME_H // contents of the header #endif /* LIBRARY_FILENAME_H */
以便在任何翻译单元中,除了第一次包含头文件外,所有后续包含都被排除在编译之外。 所有现代编译器都会记录头文件使用包含保护的事实,并且如果再次遇到该文件,只要保护仍然被定义,就不会重新解析该文件(例如,参见 gcc)。
使用 #pragma once,相同的头文件如下所示:
#pragma once // contents of the header
与头文件保护不同,此 pragma 使在多个文件中错误地使用相同的宏名称成为不可能。 另一方面,由于使用 #pragma once 的文件是基于其文件系统级别的标识排除的,因此如果头文件在一个项目中的多个位置存在,则无法防止头文件被包含两次。
[编辑] #pragma pack
这一系列的 pragma 控制随后定义的类和联合成员的最大对齐方式。
#pragma pack(arg)
|
(1) | ||||||||
#pragma pack()
|
(2) | ||||||||
#pragma pack(push)
|
(3) | ||||||||
#pragma pack(push, arg)
|
(4) | ||||||||
#pragma pack(pop)
|
(5) | ||||||||
其中 arg 是 2 的小幂,并以字节为单位指定新的对齐方式。
#pragma pack 可能会降低类的对齐方式,但是,它不能使类过度对齐。
本节尚不完整 原因:解释这些 pragma 对数据成员的影响,以及使用它们的优缺点。 参考来源 |
本节尚不完整 原因:没有示例 |
[编辑] 参考
- C++23 标准 (ISO/IEC 14882:2024)
- 15.9 Pragma 指令 [cpp.pragma]
- C++20 标准 (ISO/IEC 14882:2020)
- 15.9 Pragma 指令 [cpp.pragma]
- C++17 标准 (ISO/IEC 14882:2017)
- 19.6 Pragma 指令 [cpp.pragma]
- C++14 标准 (ISO/IEC 14882:2014)
- 16.6 Pragma 指令 [cpp.pragma]
- C++11 标准 (ISO/IEC 14882:2011)
- 16.6 Pragma 指令 [cpp.pragma]
- C++98 标准 (ISO/IEC 14882:1998)
- 16.6 Pragma 指令 [cpp.pragma]
[编辑] 参见
C 文档 关于 实现定义行为控制
|
[编辑] 外部链接
1. | Visual Studio 中的 C++ pragma |
2. | GCC 接受的 Pragmas |
3. | 各个 pragma 描述 和 IBM AIX XL C 16.1 中的标准 pragma |
4. | 附录 B. Pragmas 在 Sun Studio 11 C++ 用户指南中 |
5. | Intel C++ 编译器 pragmas |
6. | HP aCC A.06.25 的发布节点(包括 pragmas) |