據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;
}