8

我已经阅读了以下问题,答案似乎很清楚: 如何使用 C 预处理器连接两次并展开宏,如“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++;

?

4

2 回答 2

9

省略##; 仅当您想加入字符串时才需要这样做。由于参数不是字符串,它们之间的空格无关紧要(debugObj . var1与 相同debugObj.var1)。

于 2012-04-10T08:54:17.047 回答
7

您不应该将它们粘贴在一起##,因为您可以使用debugObj .var1作为单独的预处理器标记。

以下应该有效:

#define DEBUG_INC_COUNTER(x) debugObj.x++
于 2012-04-10T08:52:36.403 回答