2011-12-21 114 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