![](/img/trans.png)
[英]How do I port code that contains #pragma optimize( “a” ) from VC++7 to VC++9?
[英]How portable is code with #pragma optimize?
#pragma
是編譯器添加非認可和非可移植語言擴展*的認可且可移植的方式。
基本上,你永遠不會確定,並且至少有一個主要的C ++編譯器(g ++)不支持這個pragma。
* :
從C ++標准(N3242):
16.6 Pragma指令[cpp.pragma]
表單的預處理指令
# pragma
pp-tokens opt new-line導致實現以實現定義的方式運行。 該行為可能導致轉換失敗或導致轉換程序或生成的程序以不符合的方式運行。 將忽略實現無法識別的任何編譯指示。
根據C標准(委員會草案 - 2011年4月12日):
6.10.6 Pragma指令
語義
表單的預處理指令
# pragma
pp-tokens opt new-line其中預處理令牌
STDC
沒有立即跟隨pragma
中的pragma
(在任何宏替換之前) 174)導致實現以實現定義的方式運行。 該行為可能導致轉換失敗或導致轉換程序或生成的程序以不符合的方式運行。 任何未被實現識別的pragma
都將被忽略。
這是一個例子:
int main () {
#pragma omp parallel for
for (int i=0; i<16; ++i) {}
}
C和C ++ OpenMP API的很大一部分是作為#pragma
s實現的。
通常,依靠編譯器標志不是一個好主意,因為每個編譯器都有自己的行為。
不應使用此標志,因為它是您注入代碼的編譯級別規范。
通常和理論上,如果不使用,編譯器應該忽略該標志。
#pragma
關鍵字是可移植的,因為它應該始終在編譯器上編譯。 但是,pragma是特定於編譯器的,因此在更改編譯器時可能會抱怨一些警告。 一些pragma被廣泛使用,例如OpenMP中的這些。 為了使代碼盡可能地便於使用,您可以使用依賴於您正在使用的編譯器的#ifdef
/ #endif
來包圍您的編譯指示。 例如:
#ifdef __ICC
#pragma optimize
#endif
編譯器通常定義一些宏,例如__ICC
,使代碼知道正在使用哪個編譯器。
#pragma
不可移植,完全停止。 曾經有一個版本的gcc用來開始游戲
在我們工作中使用的編譯器中,有兩個肯定不支持#pragma optimise
,而我無法回答其他編譯器。
即使他們這樣做,因為用於優化的命令行開關是不同的,pragma的選項可能會有所不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.