2011-12-21 122 views
8

我想要做的(我本來以爲)是一個簡單的宏擴展下預處理器宏擴展

#define CLEAR_DIGIT(a,b) iconMap[a] &= ~(b) 
#define R1 4, 16 
CLEAR_DIGIT(R1); 

現在我期望擴大到CLEAR_DIGIT(4,16),它擴展到iconMap [4] & =〜16 但是,它不...如果我做CLEAR_DIGIT功能:

void ClearDigit(unsigned char a, unsigned char b) 
{ 
    iconMap[a] &= ~b; 
} 
#define R1 4, 16 
ClearDigit(R1); 

然後正常工作,所以R1被擴展出兩個參數是不一個問題......在宏功能擴展之前,有沒有辦法強制它擴展R1?

+1

相關:http://stackoverflow.com/questions/3776750/macros-evaluation-in-c-programming-language – MByD 2011-12-21 10:09:28

回答

11

您可以使用助手宏。另請參見double-stringize problem

#define CLEAR_DIGIT_HELPER(a,b) iconMap[a] &= ~(b) 
#define CLEAR_DIGIT(x) CLEAR_DIGIT_HELPER(x) 
#define R1 4, 16 
CLEAR_DIGIT(R1); 
+0

+1 - 打我吧:) – bitmask 2011-12-21 10:21:44

+1

這是一個很好的答案,但它不能解釋*爲什麼這是有效的。鏈接的雙字符串問題顯着不同 - 使用'#'和'##'時有特殊規則。這些規則不適用於此。 – jwd 2015-02-13 21:44:10