【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.
順序 選擇 循環 總結