Mike Hudgell
Mike Hudgell

Reputation: 307

C pre-processor macro expansion

I'm trying to do (what I would have thought) was a simple macro expansion

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

Now I would expect that to expand to CLEAR_DIGIT(4,16) which expands to iconMap[4] &= ~16 However, it doesn't... If I make CLEAR_DIGIT a function:

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

then it works fine, so R1 being expanded out to the two arguments isn't an issue... Is there any way of forcing it to expand R1 before doing the macro function expansion?

Upvotes: 8

Views: 6269

Answers (1)

Benoit
Benoit

Reputation: 79185

You could use a helper macro. See also 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);

Upvotes: 11

Related Questions