?
This document uses PHP Chinese website manual Release
實(shí)現(xiàn)定義的行為由#pragma
指令控制。
#pragma pragma_params | (1) | |
---|---|---|
_Pragma ( string-literal ) | (2) | (since C99) |
1)以實(shí)現(xiàn)定義的方式運(yùn)行(除非 pragma_params 是下面顯示的標(biāo)準(zhǔn)編譯指示之一。
2)刪除字串文本編碼前綴(如果有的話),外報(bào)價,和前/后空白,替換每個\"
與"
每個\\
帶\
,然后標(biāo)記化的結(jié)果(如在翻譯階段3),然后使用該結(jié)果作為如果輸入到#pragma
(1)中。
編譯指示控制編譯器的特定于實(shí)現(xiàn)的行為,例如禁用編譯器警告或更改對齊要求。任何未被識別的雜注將被忽略。
語言標(biāo)準(zhǔn)定義了以下三個編譯指示:
#pragma STDC FENV_ACCESS arg | (1) | |
---|---|---|
#pragma STDC FP_CONTRACT arg | (2) | |
#pragma STDC CX_LIMITED_RANGE arg | (3) |
其中 arg 是任一ON
或OFF
或DEFAULT
。
1)如果設(shè)置為ON
,則通知編譯器該程序?qū)⒃L問或修改浮點(diǎn)環(huán)境,這意味著禁止可能破壞標(biāo)志測試和模式更改的優(yōu)化(例如全局公共子表達(dá)式消除,代碼運(yùn)動和常量折疊) 。默認(rèn)值通常是實(shí)現(xiàn)定義的OFF
。
2)允許浮點(diǎn)表達(dá)式的收縮,即忽略舍入錯誤和浮點(diǎn)異常的優(yōu)化,如果表達(dá)式完全按照寫法進(jìn)行計(jì)算,則可以觀察到這些異常。例如,允許(x*y) + z
使用單個融合的乘加 CPU 指令來實(shí)現(xiàn)。默認(rèn)值通常是實(shí)現(xiàn)定義的ON
。
3)通知編譯器,復(fù)數(shù)乘法,除法和絕對值可以用簡化的數(shù)學(xué)公式(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
盡管可能出現(xiàn)中間溢出。換句話說,程序員保證傳遞給這些函數(shù)的值的范圍是有限的。默認(rèn)值是OFF
#pragma once
是絕大多數(shù)現(xiàn)代編譯器支持的非標(biāo)準(zhǔn)編譯指示。如果它出現(xiàn)在頭文件中,則表明它只是被解析一次,即使它被(直接或間接)多次包含在同一個源文件中。
標(biāo)準(zhǔn)的方法來防止多個包含相同的標(biāo)題是通過使用包括守衛(wèi):
#ifndef FILENAME_H #define FILENAME_H// contents of the header#endif /* FILENAME_H */
因此,任何翻譯單元中除首標(biāo)頭以外的所有內(nèi)容都不包含在匯編中。
與#pragma once
,相同的標(biāo)題顯示。
#pragma once// contents of the header
與標(biāo)頭守衛(wèi)不同,此附注使得不可能在多個文件中錯誤地使用相同的宏名稱。另一方面,由于#pragma once
基于文件系統(tǒng)級別的身份排除文件,如果它存在于項(xiàng)目中的多個位置,則無法防止包含頭兩次。
C11標(biāo)準(zhǔn)(ISO / IEC 9899:2011):
6.10.9 Pragma算子(p:178)
C99標(biāo)準(zhǔn)(ISO / IEC 9899:1999):
6.10.6 Pragma指令(p:159)
C89 / C90標(biāo)準(zhǔn)(ISO / IEC 9899:1990):
3.8.6 Pragma指令