我有一些相当通用的代码,它使用预处理器宏将某个前缀添加到其他宏上。这是一个非常简单的例子:
#define MY_VAR(x) prefix_##x
“prefix_”实际上是在别处定义的,因此每次包含文件时都会有所不同。它运行良好,但现在如果其中一个令牌不存在,我想跳过一些代码,但这不起作用:
#if defined MY_VAR(hello)
我希望它扩展为:
#ifdef prefix_hello
但我不知道怎么做。我需要使用 MY_VAR() 宏来进行扩展,所以我不能只硬编码名称。(实际上是用于一些测试代码,每次测试一堆类时,相同的代码都会包含不同的前缀,我想跳过少数几个类的测试。)
C++ 预处理器可以做到这一点吗?
更新:
这里有一些半编译的代码来进一步演示这个问题:(为了避免把它挤进下面的评论)
#define PREFIX hello
#define DO_COMBINE(p, x) p ## _ ## x
#define COMBINE(p, x) DO_COMBINE(p, x)
#define MY_VAR(x) COMBINE(PREFIX, x)
// MY_VAR(test) should evaluate to hello_test
#define hello_test "blah blah"
// This doesn't work
#ifdef MY_VAR(test)
printf("%s\n", MY_VAR(test));
#endif