你如何在#ifdef中执行宏扩展?

Mal*_*ous 6 c++ macros stringification c-preprocessor

我有一些相当通用的代码,它使用预处理器宏将某个前缀添加到其他宏上.这是一个简单的例子:

#define MY_VAR(x) prefix_##x
Run Code Online (Sandbox Code Playgroud)

"prefix_"实际上是在别处定义的,因此每次包含文件时它都会有所不同.它运行良好,但现在我有一些代码我想跳过如果其中一个令牌不存在,但这不起作用:

#if defined MY_VAR(hello)
Run Code Online (Sandbox Code Playgroud)

我希望它扩展到的是:

#ifdef prefix_hello
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何.我需要使用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
Run Code Online (Sandbox Code Playgroud)

Pot*_*ter 3

您的程序是否比这个问题描述的更多?该指令

#define MY_VAR(x) prefix_##x
Run Code Online (Sandbox Code Playgroud)

准确定义一个预处理器标识符。电话

blah ^&* blah MY_VAR(hello) bleh <>? bleh
Run Code Online (Sandbox Code Playgroud)

只需进入预处理器的一端并从另一端出来,无需定义任何内容。

如果没有其他魔法发生,您不能指望预处理器记住在前面的源代码过程中哪些参数被传递到哪些宏中。

你可以做类似的事情

#define prefix_test 1
#if MY_VAR(test) == 1
#undef prefix_test // optional, "be clean"
...
#endif
#undef prefix_test
Run Code Online (Sandbox Code Playgroud)

查询前缀当前是否具有特定值prefix_。(未定义的标识符将替换为零。)