2013-05-17 29 views
2

打印宏的名稱如何在C或C++打印宏名 如:如何用C或C++

#define APINAME abc 
#define PRINTAPI(x) printf("x") 

我想打印PRINTAPI(APINAME),而不是 「ABC」

+5

print(「APINAME」) – Andrew

+2

在C++編譯器看到它之前宏已經消失了。你究竟在努力完成什麼? – Collin

+0

對於您編輯的問題,請參閱我編輯的答案。 –

回答

3

宏是預處理器,並且在編譯代碼之前它們將被它們的相關語句替換。所以,你沒有機會在運行時擁有宏名稱。但是,你可以生成編譯時字符串名稱:

#define APINAME abc 
#define PRINTAPI(x) std::cout << #x << std::endl; 

int main() 
{ 
    PRINTAPI(APINAME); 
} 

輸出

APINAME 

在宏操作#使得輸入參數字符串文本(字符串化)

+0

是的,它的工作原理,謝謝 – user1393608

3

由於宏在預處理程序正在執行工作時消失,這發生在編譯器被調用之前,編譯器將不會在源代碼中的任何地方存在APINAME。唯一的解決方法是以某種其他方式想出兩者之間的某種聯繫,例如,

struct foo{ 
    const char *name; 
    const char *val; 
} myvar = { "APINAME", APINAME }; 

隨着宏,你可以做到這一點作爲一個班輪:

#define APINAME "abc" 
#define APINAME_VAR(x, y) struct foo x = { #y, y } 

APINAME_VAR(myvar, APINAME) 

cout << "APINAME=" << APINAME << endl 

printf("APINAME=%s\n", APINAME); 

或者,在宏觀調控的情況下:

#define PRINTAPI printf("%s=%s\n", #APINAME, APINAME) 

將打印APINAME=abc