Implementation defined behavior control - cppreference.com

##### cppreference.com

##### Search

Create account

##### Namespaces

- Page
- Discussion

##### Variants

##### Views

- View
- Edit
- History

##### Actions

# Implementation defined behavior control

From cppreference.com
< c‎ | preprocessor

Implementation defined behavior is controlled by `#pragma` directive.

### [edit] Syntax

`#pragma` pragma_params | (1) |
`_Pragma` `(` string-literal `)` | (2) | (since C99)

1) Behaves in an implementation-defined manner (unless pragma_params is one of the standard pragmas shown below.
2) Removes the encoding prefix (if any), the outer quotes, and leading/trailing whitespace from string-literal, replaces each `\"` with `"` and each `\\` with `\`, then tokenizes the result (as in translation stage 3), and then uses the result as if the input to `#pragma` in (1).

### [edit] Explanation

The pragma directive controls implementation-specific behavior of the compiler, such as disabling compiler warnings or changing alignment requirements. Any pragma that is not recognized is ignored.

### [edit] Standard pragmas

The following three pragmas are defined by the language standard:

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

where arg is either `ON` or `OFF` or `DEFAULT`.

1) If set to `ON`, informs the compiler that the program will access or modify floating-point environment, which means that optimizations that could subvert flag tests and mode changes (e.g., global common subexpression elimination, code motion, and constant folding) are prohibited. The default value is implementation-defined, usually `OFF`.
2) Allows contracting of floating-point expressions, that is optimizations that omit rounding errors and floating-point exceptions that would be observed if the expression was evaluated exactly as written. For example, allows the implementation of (x*y) + z with a single fused multiply-add CPU instruction. The default value is implementation-defined, usually `ON`.
3) Informs the compiler that multiplication, division, and absolute value of complex numbers may use simplified mathematical formulas (x+iy)×(u+iv) = (xu-yv)+i(yu+xv), (x+iy)/(u+iv) = [(xu+yv)+i(yu-xv)]/(u2
+v2
), and |x+iy| = √x2
+y2
, despite the possibility of intermediate overflow. In other words, the programmer guarantees that the range of the values that will be passed to those function is limited. The default value is `OFF`

### [edit] References

- C11 standard (ISO/IEC 9899:2011):

  - 6.10.9 Pragma operator (p: 178)

- C99 standard (ISO/IEC 9899:1999):

  - 6.10.6 Pragma directive (p: 159)

- C89/C90 standard (ISO/IEC 9899:1990):

  - 3.8.6 Pragma directive

### [edit] See also

C++ documentation for Implementation defined behavior control

### [edit] External links

- C++ pragmas in Visual Studio 2010
- Pragmas accepted by GCC 4.9.2
- Individual pragma descriptions and Standard pragmas in IBM AIX XL C 13.1
- Appendix B. Pragmas in Sun Studio 11 C++ User's Guide
- Intel C++ compiler pragmas
- HP aCC compiler pragmas

Retrieved from "http://en.cppreference.com/mwiki/index.php?title=c/preprocessor/impl&oldid=81100"