GCC预编译宏##,与另一个宏[重复]的标记连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GCC预编译宏##,与另一个宏[重复]的标记连接相关的知识,希望对你有一定的参考价值。

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

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

答案

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

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

..

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

以上是关于GCC预编译宏##,与另一个宏[重复]的标记连接的主要内容,如果未能解决你的问题,请参考以下文章

带有可变参数的嵌套宏在 GCC 中编译,但在 MSVC 中不编译

C中的预编译宏定义

gcc的预编译选项-D

gcc的预编译选项-D

gcc编译选项总结

gcc编译选项总结