我正在尝试编写一个程序,其中一些函数的名称依赖于某个宏变量的值,宏如下:
#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 预处理器和连接
是否可以将C预处理器与变量名称连接起来?
#define WIDTH 32
int dataWIDTH;
// dataWIDTH should be interpreted as 'data32'
printf("%d",dataWIDTH);
Run Code Online (Sandbox Code Playgroud) 我已经阅读了以下问题,答案似乎很清楚: 如何使用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)
?