相关疑难解决方法(0)

如何使用C预处理器连接两次并扩展宏,如"arg ## _ ## MACRO"?

我正在尝试编写一个程序,其中一些函数的名称依赖于某个宏变量的值,宏如下:

#define VARIABLE 3
#define NAME(fun) fun ## _ ## VARIABLE

int NAME(some_function)(int a);
Run Code Online (Sandbox Code Playgroud)

不幸的是,宏NAME()将其转化为

int some_function_VARIABLE(int a);
Run Code Online (Sandbox Code Playgroud)

而不是

int some_function_3(int a);
Run Code Online (Sandbox Code Playgroud)

所以这显然是错误的方式.幸运的是,VARIABLE的不同可能值的数量很小所以我可以简单地做一个#if VARIABLE == n并单独列出所有情况,但我想知道是否有一个聪明的方法来做到这一点.

c concatenation token c-preprocessor

141
推荐指数
3
解决办法
7万
查看次数

C 预处理器与变量的连接

可能的重复:
C 预处理器和连接

是否可以将C预处理器与变量名称连接起来?

#define  WIDTH 32

int dataWIDTH;


// dataWIDTH should be interpreted as 'data32'

printf("%d",dataWIDTH);
Run Code Online (Sandbox Code Playgroud)

c variables concatenation c-preprocessor

7
推荐指数
1
解决办法
9224
查看次数

如何使用带有点的C预处理器连接字符串?

我已经阅读了以下问题,答案似乎很清楚: 如何使用C预处理器连接两次并扩展宏,如"arg ## _ ## MACRO"?

但是如果VARIABLE最后有一个点呢?

我正在尝试做一个简单的宏,增加结构中的计数器以进行调试.即使没有上述问题的帮助,我也可以轻松地做到这一点

#ifdef DEBUG
#define DEBUG_INC_COUNTER(x) x++
#endif
Run Code Online (Sandbox Code Playgroud)

并称之为

DEBUG_INC_COUNT(debugObj.var1);
Run Code Online (Sandbox Code Playgroud)

但是添加"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
Run Code Online (Sandbox Code Playgroud)

我明白了

macro.c:6:1: error: pasting "." and "var" does not give a valid preprocessing token
Run Code Online (Sandbox Code Playgroud)

那么我应该如何改变这一点呢

DEBUG_INC_COUNTER(var);
Run Code Online (Sandbox Code Playgroud)

生成

debugObj.var++;
Run Code Online (Sandbox Code Playgroud)

c concatenation c-preprocessor

5
推荐指数
2
解决办法
5309
查看次数

标签 统计

c ×3

c-preprocessor ×3

concatenation ×3

token ×1

variables ×1