2011-12-21 7 views
8

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

#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

ответ

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

+1

Это прекрасный ответ , но это не объясняет * почему * это работает. Связанная проблема с двумя строками существенно отличается - существуют специальные правила, когда используются '#' и '##'. Эти правила здесь не применяются. – jwd

Смежные вопросы