2009-04-30 35 views

回答

25

如何:

#define UNSAFE_GET(X) String str_##X = getFunction(#X); 

或者,對嵌套的宏觀問題的安全防範:

#define STRINGIFY2(x) #x 
#define STRINGIFY(x) STRINGIFY2(x) 
#define PASTE2(a, b) a##b 
#define PASTE(a, b) PASTE2(a, b) 

#define SAFE_GET(X) String PASTE(str_, X) = getFunction(STRINGIFY(X)); 

用法:

SAFE_GET(foo) 

而這就是編譯:

String str_foo = getFunction("foo"); 

要點:

  • 使用##到宏觀參數組合成一個單一的標記(標記=>變量名等)
  • 和#到字符串化宏參數(非常有用做「反思」的時候在C/C++中)
  • 爲您的宏使用一個前綴,因爲它們全部位於同一個「名稱空間」中,並且您不想與其他任何代碼發生衝突。 (我根據你的用戶名選擇了MLV)
  • 如果您嵌套宏,即從另一個宏與其他合併/字符串參數調用MLV_GET(根據下面的註釋,謝謝!),包裝宏將有所幫助。
+3

一個註釋 - 使用令牌粘貼和字符串化操作符應間接使用類似函數的宏來完成,以防止在宏觀參數中使用它們時出現問題。請參閱:http://stackoverflow.com/questions/216875/in-macros/217181#217181 – 2009-04-30 15:20:33

2

一種方法是不是當你調用宏引用名稱:

#include <stdio.h> 

#define GET(name) \ 
    int int##name = getFunction(#name); \ 


int getFunction(char * name) { 
    printf("name is %s\n", name); 
    return 42; 
} 

int main() { 
    GET(foobar); 
} 
2

在回答你的問題,不,你不能「脫光」在C++的報價。但正如其他答案所示,您可以「添加它們」。既然你總是使用字符串文字(對吧?),你應該可以切換到新的方法。