在线文档教程
C++
语言 | Language

#pragma directive

实现定义的行为控制

实现定义的行为由#pragma指令。

句法

#pragma pragma_params(1)
_Pragma ( string-literal )(2)(since C++11)

1%29以实现定义的方式行为。

2%29移除L前缀%28(如果有%29)、外部引号和字符串-文字中的前导/尾随空格替换每个\"带着"每一个\\带着\,然后将结果%28标记为翻译阶段3%29,然后将结果用作#pragma%281%29

解释

Pragma指令控制编译器特定于实现的行为,例如禁用编译器警告或更改对齐要求。任何未被识别的语用都会被忽略。

非标准语用

ISO C++语言标准不要求编译器支持任何实用程序。但是,多个实现支持一些非标准的务实:

#语用STDC

ISO C语言标准要求C编译器支持以下三种实用程序,一些C++编译器供应商在不同程度上支持C++前端:

#pragma STDC FENV_ACCESS arg(1)
#pragma STDC FP_CONTRACT arg(2)
#pragma STDC CX_LIMITED_RANGE arg(3)

Arg在哪ONOFFDEFAULT...

1%29如果设置为ON,通知编译器程序将访问或修改浮点环境,这意味着可能破坏标志测试和模式的优化会更改%28e。禁止全局通用子表达式消除、代码运动和恒定折叠%29。默认值通常是实现定义的。OFF...

2%29允许承包对于浮点表达式,即省略舍入错误和浮点异常的优化,如果表达式完全按照写入的方式计算,则会观察到这些异常。例如,允许实现(x*y) + z与一个单一的融合多加CPU指令。默认值通常是实现定义的。ON...

3%29通知编译器,复数的乘法、除法和绝对值可以使用简化的数学公式%28x+iy%29×%28u+iv%29=%28xu-yv%29+i%28 yu+XV%29,%28x+iy%29/%28 u+iv%29=。%28 xu+yv%29+i%28 yu-XV%29/%28u2

+v2

%29,x+iy=xii x2

+y2

,尽管有中间溢出的可能性。换句话说,程序员保证传递给这些函数的值的范围是有限的。默认值是OFF

如果上述三种语用中的任何一种出现在所有外部声明之外的任何上下文中,或者在复合语句中的所有显式声明和语句之前出现,则程序的行为是未定义的。

#语用一次

#pragma once是由绝大多数现代编译器如果它出现在一个头文件中,它表示它只被解析一次,即使它是%28直接或间接地包含在同一个源文件中多次包含的%29。

防止多个包含同一个标头的标准方法是使用包括警卫*

二次

#ifndef FILENAME_H #define FILENAME_H // contents of the header #endif /* FILENAME_H */

二次

因此,除第一次将头包含在任何翻译单元外,所有的标题都被排除在编译之外。

带着#pragma once,相同的标题显示为。

二次

#pragma once // contents of the header

二次

与头保护不同的是,这种转换使得不可能在多个文件中错误地使用相同的宏名称。另一方面,因为#pragma once基于文件系统级别的标识,文件被排除在外,如果一个文件头存在于一个项目中的多个位置,这可以防止它被包含两次。

#语用包

另见

实现定义的行为控制的文档

*。

外部链接

© cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

http://en.cppreference.com/w/cpp/preProcessor/impl