我已经阅读了以下问题,答案似乎很清楚: How to concatenate twice with the C preprocessor and expand a macro as in "arg ## _ ## MACRO"?
但是如果VARIABLE在最后有一个点呢?
我正在尝试做一个简单的宏,它会增加结构中的计数器以进行调试。即使没有上述问题的帮助,我也可以轻松地做到这一点
#ifdef DEBUG
#define DEBUG_INC_COUNTER(x) x++
#endif
并将其命名为
DEBUG_INC_COUNT(debugObj.var1);
但是添加“debugObj”。每个宏看起来都非常多余。但是,如果我尝试连接:
#define VARIABLE debugObj.
#define PASTER(x,y) x ## y++
#define EVALUATOR(x,y) PASTER(x,y)
#define DEBUG_INC_COUNTER(x) EVALUATOR(VARIABLE, x)
DEBUG_INC_COUNTER(var)
gcc -E macro.c
我得到了
macro.c:6:1: error: pasting "." and "var" does not give a valid preprocessing token
那么我应该如何改变呢?
DEBUG_INC_COUNTER(var);
产生
debugObj.var++;
答案 0 :(得分:5)
省略##
;只有在想要连接字符串时才需要这样做。由于参数不是字符串,因此它们之间的空格无关紧要(debugObj . var1
与debugObj.var1
相同)。
答案 1 :(得分:4)
您不应该使用##
将它们粘贴在一起,因为您可以将debugObj
.
和var1
作为单独的预处理程序令牌。
以下内容应该有效:
#define DEBUG_INC_COUNTER(x) debugObj.x++