2011-12-21 3 views
8

내가 할 노력하고있어 (나는 생각을했을 것) 확장C 프리 프로세서는 매크로 확장

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

가 지금은 그 CLEAR_DIGIT에 (4,16)를 확장 기대 간단한 매크로 확장했다 I는 CLEAR_DIGIT에게 기능을하면 iconMap [4] & 그러나 = ~ 16 , 그것은 ...없는 사항 : R1은 두 인수 밖으로 확장되지 않도록 그 때 잘 작동

void ClearDigit(unsigned char a, unsigned char b) 
{ 
    iconMap[a] &= ~b; 
} 
#define R1 4, 16 
ClearDigit(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

일을 - 그것에 나를 이길 :) – bitmask

+1

을 그것은 좋은 대답 , 그러나 이것이 * 왜 * 작동하는지 설명하지 않습니다. 연결된 double-stringize 문제는 특히 다르다.'#'과'## '이 사용될 때 특별한 규칙이있다. 이 규칙은 여기에 적용되지 않습니다. – jwd