我知道我已经有一个类似的帖子(C++ `ifdef` with concatenation of macros values),但是该帖子已经很老了,所提供的解决方案对我不起作用,因为我无法设置要检查的定义。所以我希望有人能帮助我。
问题是我想用固定的文本将两个a定义串联在一起的ifdef。
想象下面的代码
#define ENABLE_MODULE_1
enum Modultype
{
MODULE_1,
MODULE_2
};
#define MODULE MODULE_1
int main()
{
#ifdef ENABLE_ ## MODULE
printf("NAME defined");
#else
printf("NAME not defined");
#endif
return 0;
}
因此,我基本上想检查是否根据ENABLE_MODULE_1
定义定义了MODULE
。
我希望有人能帮助我。谢谢!
答案 0 :(得分:0)
这是不可能的。预处理器宏仅扩展一次,并且仅在未在另一个预处理器语句中扩展时才扩展。除此之外,串联只能在#define
语句中使用。
答案 1 :(得分:0)
您无法精确地执行所需的操作,因为#ifdef
对标识符而不是预处理程序表达式进行运算,并且##
运算符只能在宏定义的替换文本中使用。
如果您愿意使用非零常量作为其替换文本来定义ENABLE_MODULE_1
(如果完全定义),则可以实现与您想要的类似的东西:
#include <stdio.h>
#define XENABLED(x) ENABLE_ ## x
#define ENABLED(x) XENABLED(x)
#define XSTR(x) #x
#define STR(x) XSTR(x)
#define ENABLE_MODULE_1 1 /* enabled */
#define ENABLE_MODULE_3 0 /* not enabled */
#define MODULE MODULE_1
#define OTHER MODULE_2
#define ANOTHER MODULE_3
int main(void)
{
#if ENABLED(MODULE)
printf("%s enabled\n", STR(MODULE));
#else
printf("%s not enabled\n", STR(MODULE));
#endif
#if ENABLED(OTHER)
printf("%s enabled\n", STR(OTHER));
#else
printf("%s not enabled\n", STR(OTHER));
#endif
#if ENABLED(ANOTHER)
printf("%s enabled\n", STR(ANOTHER));
#else
printf("%s not enabled\n", STR(ANOTHER));
#endif
#if ENABLED(UNDEFINED)
printf("%s enabled\n", STR(UNDEFINED));
#else
printf("%s not enabled\n", STR(UNDEFINED));
#endif
return 0;
}
上面的程序产生以下输出:
MODULE_1 enabled
MODULE_2 not enabled
MODULE_3 not enabled
UNDEFINED not enabled
更新1
这里是使用defined()
的另一种变体,它不需要ENABLE_MODULE_1
,ENABLE_MODULE_2
等扩展到任何东西(如果它们是完全定义的)。它只是检查测试是否已定义。
测试可以是间接的:
#define MODULE MODULE_1
#if ENABLED(MODULE)
或直接:
#if ENABLED(MODULE_1)
以下是变体:
#include <stdio.h>
#define XENABLED(x) defined(ENABLE_ ## x)
#define ENABLED(x) XENABLED(x)
#define XSTR(x) #x
#define STR(x) XSTR(x)
#define ENABLE_MODULE_1
#define MODULE MODULE_1
#define OTHER MODULE_2
int main(void)
{
printf("Indirect tests...\n");
#if ENABLED(MODULE)
printf("%s enabled\n", STR(MODULE));
#else
printf("%s not enabled\n", STR(MODULE));
#endif
#if ENABLED(OTHER)
printf("%s enabled\n", STR(OTHER));
#else
printf("%s not enabled\n", STR(OTHER));
#endif
#if ENABLED(UNDEFINED)
printf("%s enabled\n", STR(UNDEFINED));
#else
printf("%s not enabled\n", STR(UNDEFINED));
#endif
printf("Direct tests...\n");
#if ENABLED(MODULE_1)
printf("%s enabled\n", STR(MODULE_1));
#else
printf("%s not enabled\n", STR(MODULE_1));
#endif
#if ENABLED(MODULE_2)
printf("%s enabled\n", STR(MODULE_2));
#else
printf("%s not enabled\n", STR(MODULE_2));
#endif
return 0;
}
上述变体的输出:
Indirect tests...
MODULE_1 enabled
MODULE_2 not enabled
UNDEFINED not enabled
Direct tests...
MODULE_1 enabled
MODULE_2 not enabled