2013-05-13 37 views
-1
#define DECLARE_DELETE_PTR(type) \ 
void DeletePtr_##type(string &operand) \ 
{\ 
}\ 

什麼的##在C++中的宏定義的含義是什麼意思?什麼##在C++中的定義代碼

跟隨代碼有什麼區別?

#define MAKE_STRINGS(VAR) #VAR 

它只有一個#,但前者是二#

+0

見(除其他)[以C近拍指令(http://stackoverflow.com/questions/8685619/macro-directives -in-c-my-code-example-doesnt-work)用於討論字符串化(使用單個'#',如各種答案的註釋中所述)和[C預處理器和級聯](http:// stackoverflow 。com/questions/1489932/c-preprocessor-and-concatenation /)來獲取這個問題的重複。 – 2013-05-13 06:59:16

回答

2

它加到你通過參數type值...

DECLARE_DELETE_PTR(gremlin) 

將擴展爲:

void DeletePtr_gremlin(string &operand) 
{ 
} 
+0

跟隨代碼有什麼區別? #define MAKE_STRINGS(VAR)#VAR 它只有一個#,但前者是兩個# – jiafu 2013-05-13 05:22:56

+1

單個散列確實* stringification *(它將您的值並將其括在雙引號中)。雙重哈希不替代*。因此,'MAKE_STRINGS(gremlin)'會擴展到''gremlin''。 – paddy 2013-05-13 05:24:50

+0

@Paddy:否 - 雙重哈希執行標記連接,所以(例如)'x ## y'被粘貼在一起成爲單個標記'xy'。 – 2013-05-13 05:27:25

2

它要求預編譯器來連接兩個標記。

#define DECLARE_DELETE_PTR(type) \ 
void DeletePtr_##type(string &operand) \ 
{\ 
}\ 

DECLARE_DELETE_PTR(int)會給:

void DeletePtr_int(string &operand) 
      //^^^ the macro argument is int, so the precompiler replaces it here 
{ 
} 

事實上,在宏代碼,參數type與命令的其餘部分連接起來。如果宏參數是int,那麼這只是一個簡單的替代,給出了上述結果。請記住,由於它是預處理器指令,它完全在編譯時發生。

如果你在linux上,我建議看看cpp命令,以便更好地理解和嘗試。


至於你的第二個問題,區別在於它只是兩個不同的操作符。正如顧名思義 - >它將它的參數變成一個c字符串(我剛剛嘗試過)。例如:

std::cout << MAKE_STRINGS(Hello World) << std::endl; 

會變成:

std::cout << "Hello World" << std::endl 

或者,更有趣:

std::cout << MAKE_STRINGS("Hello" World) << std::endl; 

變爲:

std::cout << "\"Hello\" World" << std::endl; 

看來它也需要逃避的護理特殊字符,但是我可能是錯的 - 這來自3分鐘前的實驗。

+2

不是字符串 - 令牌。規則實際上相當嚴格。 – 2013-05-13 05:21:24

+0

正確 - 這可能會造成混淆。我會替換,謝謝。 – Nbr44 2013-05-13 05:22:10

+0

跟隨代碼有什麼區別? 的#define MAKE_STRINGS(VAR)#VAR 它只有一個#,但前者是二# – jiafu 2013-05-13 05:22:24

2

的##運算符用於連接兩個令牌。下面是一個例子:

DECLARE_DELETE_PTR(MyType) 

//將擴展到

void DeletePtr_MyType(string &operand) 
{ 
} 
+0

跟隨代碼有什麼區別? #define MAKE_STRINGS(VAR)#VAR它只有一個#,但前者是兩個# - – jiafu 2013-05-13 05:24:27

+0

使用單個「#」會導致字符串化。看看http://gcc.gnu.org/onlinedocs/cpp/Stringification.html – Arun 2013-05-13 05:28:15

相關問題