如何与C预处理器连接两次并展开宏(如“arg ## _ ## MACRO”中的宏)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

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

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

int NAME(some_function)(int a);

NAME()把它变成

int some_function_VARIABLE(int a);

而不是

int some_function_3(int a);

因此,这显然是错误的做法。变量的不同可能值的数目很小,所以我可以简单地执行#if VARIABLE == n然后分别列出所有的case,还有别的方法吗?

提问于
用户回答回答于
#define VARIABLE 3
#define NAME2(fun,suffix) fun ## _ ## suffix
#define NAME1(fun,suffix) NAME2(fun,suffix)
#define NAME(fun) NAME1(fun,VARIABLE)

int NAME(some_function)(int a);

用户回答回答于

标准C预处理器

$ cat xx.c
#define VARIABLE 3
#define PASTER(x,y) x ## _ ## y
#define EVALUATOR(x,y)  PASTER(x,y)
#define NAME(fun) EVALUATOR(fun, VARIABLE)

extern void NAME(mine)(char *x);
$ gcc -E xx.c
# 1 "xx.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "xx.c"





extern void mine_3(char *x);
$

扫码关注云+社区