在令牌粘贴的宏上使用#ifdef?

时间:2019-06-26 17:06:15

标签: c c-preprocessor

我知道我已经有一个类似的帖子(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

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

2 个答案:

答案 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_1ENABLE_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