2015-06-25 67 views
0

我有這樣簡單的代碼:當宏使用clang擴展時,爲什麼'##'不會消失?

#define THE_MACRO World 

void Hello##THE_MACRO() 
{ 
} 

通過預處理它clang++ code.cpp -E我得到這樣的結果:

# 1 "code.cpp" 
# 1 "<built-in>" 1 
# 1 "<built-in>" 3 
# 326 "<built-in>" 3 
# 1 "<command line>" 1 
# 1 "<built-in>" 2 
# 1 "code.cpp" 2 


void Hello##World() 
{ 
} 

請注意##還停留在代碼,並會導致編譯錯誤:

code.cpp:3:6: error: variable has incomplete type 'void' 
void Hello##THE_MACRO() 
    ^
code.cpp:3:11: error: expected ';' after top level declarator 
void Hello##THE_MACRO() 
     ^
      ; 

我無法確定代碼有什麼問題。應該爲clang提供更多的參數嗎?

+2

##只在宏內工作,不是? – bmargulies

回答

1

##運算符必須出現在宏的內部。宏按照它們可用的順序進行處理,但是如果一個宏的結果產生一個新的宏,那麼它也將被處理。因此,有時你想讓一個宏調用另一個實際實現該功能的宏(稍後定義)以確保正確處理參數。

所以,如果你想建立自己的宏設定,你可以這樣做:

#include <iostream> 

#define MERGE(A,B) MERGE_IMPL(A,B) 
#define MERGE_IMPL(A,B) A ## B 

#define XXX Hello 
#define YYY World 

void MERGE(XXX, YYY)() { 
    std::cout << "Yay!" << std::endl; 
} 

int main() { 
    HelloWorld(); 
} 

上述程序應該運行,正確地轉換宏,允許定義成功調用了HelloWorld()函數從主要。

+0

完美的解決方案。謝謝。 – jayatubi

1

編輯您的宏如下:

#define THE_MACRO(x) x ## World() 

然後:

void THE_MACRO(Hello) 
{ 
} 

由於@bmargulies指出,##是在宏觀背景下可用。

+0

「Hello」由另一個宏定義?比如'#define HELLO_MACRO Hello'和'void THE_MACRO(HELLO_MACRO)',那麼我得到結果'void HELLO_MACROWorld()' – jayatubi

相關問題