Расширение макропроцессора C - PullRequest
8 голосов
/ 21 декабря 2011

Я пытаюсь сделать (то, что я думал бы) было простое расширение макроса

#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 Ответ

11 голосов
/ 21 декабря 2011

Вы можете использовать вспомогательный макрос.См. Также двойная строковая задача

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