C预处理器宏扩展

C预处理器宏扩展,c,macros,c-preprocessor,C,Macros,C Preprocessor,我试图做的(我本以为)是一个简单的宏观扩展 #define CLEAR_DIGIT(a,b) iconMap[a] &= ~(b) #define R1 4, 16 CLEAR_DIGIT(R1); 现在我希望它扩展到清除数字(4,16),它扩展到iconMap[4]&=~16 但是,它不。。。如果我对函数进行了明确说明: void ClearDigit(unsigned char a, unsigned char b) { iconMap[a] &= ~b; }

我试图做的(我本以为)是一个简单的宏观扩展

#define CLEAR_DIGIT(a,b)    iconMap[a] &= ~(b)
#define R1 4, 16
CLEAR_DIGIT(R1);
现在我希望它扩展到清除数字(4,16),它扩展到iconMap[4]&=~16 但是,它不。。。如果我对函数进行了明确说明:

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

然后它工作正常,所以R1扩展到两个参数不是问题。。。在执行宏函数展开之前,有没有办法强制它展开R1?

您可以使用辅助宏。另见


相关报道:这是一个很好的答案,但它并没有解释为什么这是有效的。链接的双重字符串化问题明显不同-使用
#
#
时有特殊规则。这些规则在这里不适用
R1
已展开,但仍被视为单个参数。在这种情况下,
CLEAR_DIGIT(R1)
将扩展到
iconMap[4,16]&=~()
,输出参数不足的警告。这似乎与中国的问题有关。那里的解决方案也解决了这个问题。
#define CLEAR_DIGIT_HELPER(a,b) iconMap[a] &= ~(b)
#define CLEAR_DIGIT(x) CLEAR_DIGIT_HELPER(x)
#define R1 4, 16
CLEAR_DIGIT(R1);