C 在标记粘贴的宏上使用ifdef?

C 在标记粘贴的宏上使用ifdef?,c,c-preprocessor,C,C Preprocessor,我知道已经有一篇类似于我的文章了,但是这篇文章很老了,提供的解决方案对我不起作用,因为我无法设置要检查的定义。所以我希望有人能帮助我 问题是,我想用一个固定的文本来定义两个连接的ifdef 想象一下下面的代码 #define ENABLE_MODULE_1 enum Modultype { MODULE_1, MODULE_2 }; #define MODULE MODULE_1 int main() { #ifdef ENABLE_ ## MODULE

我知道已经有一篇类似于我的文章了,但是这篇文章很老了,提供的解决方案对我不起作用,因为我无法设置要检查的定义。所以我希望有人能帮助我

问题是,我想用一个固定的文本来定义两个连接的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 define定义的


我希望有人能帮助我。谢谢

这是不可能的。预处理器宏仅展开一次,并且仅当不在另一个预处理器语句中时才展开。除此之外,连接只能在define语句中使用。

您无法精确执行所需操作,因为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;
}

请提供旧帖子的链接。并且不能在预处理器中使用预处理器。该运算符特定于宏等函数的替换列表。您不能在条件包含指令中直接使用它。您仍然不能这样做-为什么不问一个关于失败的解决方案的问题呢?这就是您所指的问题吗?您能解释一下为什么@templatetypedef链接的问题中的解决方案不适合您吗?谢谢您的建议!不幸的是,我无法设置ENABLE_MODULE_1,因为它是在我无权访问的配置文件中给出的。因此,我正在寻找一个通用的解决方案,这样我就不必手动检查每个启用,但显然这是无法做到的。无论如何,非常感谢您的努力。@EmbedEngineer我已经添加了一个使用defined的变体,这可能会对您有所帮助。@IanAbbott注意到,使用defined的解决方案。。。就标准而言,调用未定义的行为:“如果定义的令牌是由[If或elif控制表达式中的宏替换]生成的,则该行为是未定义的”C89 6.8.1、C99和C11 6.10.1。是的,在标准C中,您可以在编译期间调用未定义的行为;“是的,那太愚蠢了!”阿列克谢希尔金谢谢你提供的信息。我要把那部分去掉。
MODULE_1 enabled
MODULE_2 not enabled
MODULE_3 not enabled
UNDEFINED not enabled