C++11 __pragma操作符


【1】__pragma 與 #pragma 的區別

在C/C++標准中,#pragma是一條預處理的指令(preprocessor directive)。

簡單地說,#pragma是用來向編譯器傳達語言標准以外的一些信息。

舉個常見的例子,如果我們在代碼的頭文件中定義了以下語句:

#pragma once

那么,該指令會指示編譯器(如果編譯器支持)該頭文件應該只被編譯一次。

這與使用如下代碼來定義頭文件所達到的效果是一樣的:

#ifndef THIS_HEADER
#define THIS_HEADER
//一些頭文件的定義
#endif

在C++11中,標准定義了與預處理指令#pragma功能相同的操作符__pragma。

__pragma操作符的格式如下:

__pragma(字符串字面量)

其使用方法跟sizeof等操作符一樣,將字符串字面量作為參數寫在括號內即可。

那么,要達到與上例#pragma類似的效果,則只需要如下代碼即可。

__pragma("once")

而相比預處理指令#pragma,由於__pragma是一個操作符,因此可以用在一些宏中。

為了加深理解,可以再看下面這個例子:

假設編譯器支持4個不同程度的優化等級,如果使用#pragma,則這樣寫:

#pragma OPT_LEVEL n   // n的范圍[1, 4]

你會不會覺得每次都要重復寫“#pragma...”很麻煩?如果可以利用宏定義來簡化書寫就好了:

#define OPT_L(x) #pragma OPT_LEVEL x

這時我們只須寫:

OPT_L(3)

就相當於寫:

#pragma OPT_LEVEL 3

可惜.....在C90這里永遠是一個夢想!因為字符“#”在預處理指令中有特殊的用途,跟在它后面的必須是宏的參數名,例如:

#define MACRO(x) #x

那么,MACRO(example)的替換結果為:

“example”

於是可以想象,前面通過#define來定義一個關於#pragma的宏是不可行的。

不過,新的關鍵字“__pragma”就很好的解決了這個問題,由於__pragma並沒有字符“#”,所以我們可以放心的定義宏:

#define PRAGMA(X) __pragma(#X)
#define OPT_L(X) PRAGMA(OPT_LEVEL X)

這時,我們只要寫:

OPT_L(2)

經過預處理后,就成為:

__pragma("OPT_LEVEL 2")

即就是:

#pragma OPT_LEVEL 2

【2】總結

該操作符__pragma 具有 與 #pragma指令相同的功能。不同之處在於:

 __pragma操作符在宏定義中是以內聯方式使用的。 

#pragma指令不可用於宏定義中,因為編譯器會將指令中的數字符號("#")解釋為字符串化運算符(#)。

 

Good Good Study,Day Day Up.

順序 選擇 循環 總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM