2016-09-25 42 views
1

的給出的以下的代碼:錯誤使用字串

#define MY_STRINGIFY_MACRO(...) #__VA_ARGS__ 

#define PORT_MAC(portNum) port: portNum 

#define LOG_MACRO(...) 
    printf(MY_STRINGIFY_MACRO(__VA_ARGS__)) 

void func(int portNum) 
{ 
    LOG_MACRO(PORT_MAC(portNum)); /* In a more general way I would use this macro as LOG_MACRO(PORT_MAC(portNum), PORT_MAC(portNum1) ...); to get output of " port: 2, port: 3 ... "*/ 
} 

func()調用與端口號,例如2,輸出爲:

port: portNum 

代替

port: 2 

如果我用以下方式使用宏:

LOG_MACRO(PORT_MAC(2)); 

然後我得到所需的輸出:

port: 2  

如何解決我的代碼,以便它可以處理這兩種情況下,輸出將始終包含portNum價值?

回答

1

你似乎對編譯時與運行時感到困惑。

宏在編譯時運行(在其他任何事情完成之前)。這是更換髮生的時間。此時,CPP(C預處理器)唯一考慮的就是文本。它沒有看到其他任何東西(甚至不關心它是有效的C代碼!)。然後你的代碼被編譯,你得到你的二進制文件(默認爲a.out)。

此時,無代碼執行。沒有功能被調用。只有在啓動程序時($ ./a.out)纔會調用函數,並傳遞參數。你想做什麼是不可能的。您唯一的選擇是在運行時替換文本。

+0

'你唯一的選擇是在運行時在文本中替換'你能解釋一下嗎? – user2162550

+0

你有一個'const char *'(你傳遞給'printf')。您需要將值手動替換(不要忘記先複製字符串,修改'const char *'可能會導致段錯誤)。另一種方法是調用'LOG_MACRO(PORT_MAC(%d),portNum)'。但是這意味着'LOG_MACRO'不允許使用'__VA_ARGS__'(因爲你需要將'__VA_ARGS__'傳遞給printf) – Ven