2013-01-21 28 views

回答

1
#define PASTE(a,b) a##b 
int foo; 
foo PASTE(+,=) 2; 

我見過的唯一一次這是有用是一個字節碼解釋器,這往往看起來像一個巨大的case語句非常重複的代碼在每個臂的內循環:

case OP_add: { 
    if (sp < 2) goto underflow; 
    double x = stack[--sp]; 
    stack[sp-1] += x; 
} break; 

對每個支持的二進制算術運算符重複。隨着能力令牌粘貼,就可以從宏中生成所有這些:

#define ARITH_BINOP(name, oper) case OP_##name: { \ 
    if (sp < 2) goto underflow; \ 
    double x = stack[--sp]; \ 
    stack[sp-1] oper##= x; \ 
} break /* deliberate absence of semicolon */ 

,然後,在開關,你可以只寫

ARITH_BINOP(add, +); 
ARITH_BINOP(sub, -); 
ARITH_BINOP(mul, *); 
/* etc */ 
0

我認爲,文件說,大約樣病例:

#define COMPST(x, y) x ## y 

int 
foo(int x) 
{ 
    return x COMPST(+, =) 2; 
} 
0

當然宏可以執行任何你可以在C代碼實現:

#define INCREMENT(x) ((x) += 1) 

main() { 
    int n=42; 
    INCREMENT(n); 
} 

你讀的這行意味着另一件我懷疑你不感興趣的東西......