2011年1月4日 星期二

COUNT (1)('2')(1.2F)("3") 巨集展開

最近在研究些C語言的前置處理器的一些有趣的特殊用法。

;

const int COUNT1 = 1;
const int COUNT2 = 2;
const int COUNT3 = 3;
const int COUNT4 = 4;

#define COUNT1(a) COUNT2
#define COUNT2(a) COUNT3
#define COUNT3(a) COUNT4

#define COUNT(arg) COUNT1

int main()
{
    printf("arg count = %d\n", COUNT (1)('2')(1.2F)("3"));
}

輸出結果:

arg count = 4

很神奇!

;

COUNT這個巨集是如何展開的呢?底下來看一下分解動作。


COUNT (1)('2')(1.2F)("3")
-> COUNT1('2')(1.2F)("3")
-> COUNT2(1.2F)("3")
-> COUNT3("3")
-> COUNT4

在前面的COUNT1~COUNT3因為在名稱右側都有個括號,所以會作為巨集展開,直到解到最後一個COUNT4,右側已經沒有了括號了,所以直接以上面的int直取代,也就是4。

;

PS: 在Boost裡面有個Preprocessor模組可以看到更多Preprocessor Metaprogramming的應用。

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...