GCC预编译器宏##,与作为另一个宏的令牌连接

时间:2017-12-30 05:41:22

标签: c gcc macros c-preprocessor

正如你可以看到连接令牌的工作,
还有一个令牌是另一个宏工作,
但是当一个令牌是宏时,它似乎不起作用?

longNameForaFunction_one(){return 1;}
longNameForaFunction_two(){return 2;}
longNameForaFunction_third(){return 3;}
two(){return 2;}
#define bar two
#define foo(x)(longNameForaFunction_##x())
#define three third
main(){
printf("%d\n",foo(one)); // 1

printf("%d\n",foo(two)); // 2

printf("%d\n",bar()); // 2

// printf("%d\n",foo(three)); // this doesn't work  
}

如果取消注释,最后一行会出现此错误;

  

对`longNameForaFunction_three'的未定义引用

#define three third

似乎无效

Try it online

1 个答案:

答案 0 :(得分:1)

这就是为什么你需要在它工作之前提供另一个级别的原因 - 宏参数将在传递给foo之前进行扩展。

#define foo(x)(longNameForaFunction_##x())
#define foo1(x) foo(x)
#define three third

..

printf("%d\n",foo1(three));