2011-12-21 11 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); 

を2つの引数に出て展開され、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

をそれは罰金の答えですしかし、それは*なぜ*この作品が説明されていません。リンクされたdouble-stringizeの問題は、特に異なっています - '#'と '## 'が使われるときは特別な規則があります。これらのルールはここでは適用されません。 – jwd