2014-03-12 70 views
1

的我得到了這些宏組成令牌膠粘宏

#define NEXT(of_) ((of_ ## _SUFFIX) + 1) 
#define AA_SUFFIX (1) 
#define BB_SUFFIX (NEXT(AA)) // expands to ((((1)) + 1)) 
#define CC_SUFFIX (NEXT(BB)) // expands to ((((NEXT(AA))) + 1)) !!! 

我想CC_SUFFIX擴大到3,但它沒有(見上文)。 有沒有辦法讓預處理器在這種情況下評估下一個(AA)?

回答

1

this答案,預處理器「[...]遞歸地擴展了對其他宏的出現次數替換文本(宏本身被阻塞在這些遞歸調用。)」

考慮到這一點,由於宏NEXT(of_)已被使用一次,因此CC_SUFFIX的擴展結果爲((((NEXT(AA))) + 1))是合理的。爲了證實這是你可以創建一個新的宏,做同樣的事情NEXT(of_)BB_SUFFIX使用它的原因:

#define NEXT(of_) ((of_ ## _SUFFIX) + 1) 
#define NEXT1(of_) ((of_ ## _SUFFIX) + 1) 
#define AA_SUFFIX (1) 
#define BB_SUFFIX (NEXT1(AA)) 
#define CC_SUFFIX (NEXT(BB)) 

int main(void){ 
    BB_SUFFIX; 
    CC_SUFFIX; 
} 

運行gcc -E macros.c輸出爲:

# 1 "/home/jfacorro/dev/macros-expand.c" 
# 1 "<command-line>" 
# 1 "/home/jfacorro/dev/macros-expand.c" 
int main(void){ 
    ((((1)) + 1)); 
    (((((((1)) + 1))) + 1)); 
} 

作爲一個側面說明,沒有必要在括號中包含宏的表達式,如果你失去它們,擴展會讀得更清晰。

#define NEXT(of_) of_ ## _SUFFIX + 1 
#define NEXT1(of_) of_ ## _SUFFIX + 1 
#define AA_SUFFIX 1 
#define BB_SUFFIX NEXT1(AA) 
#define CC_SUFFIX NEXT(BB) 

產生輸出:

int main(void){ 
    1 + 1; 
    1 + 1 + 1; 
}