使用另一个宏生成#ifdef,#endif子句

时间:2011-01-25 11:15:49

标签: c macros c-preprocessor

我正在处理的程序中遇到问题。我正在尝试--help来显示编译或不编译的功能。然而,有很多这些,“正常”的方式太冗长。 E.g:

#ifdef HAVE_FOO
static const bool have_foo = true;
#else
static const bool have_foo = false;
#endif
printf("Support for foo: %s\n", have_foo ? "yes" : "no");

现在,因为我必须基本上为每个功能执行此操作,所以它将是大量的行,这是我不想要的。

所以我想我会为它写一些宏:

#define _SUPP(X) #ifdef HAVE_##X \
static const bool _##X##_SUPP = true; \
#else \
static const bool _##X##_SUPP = false; \
#endif

#define _PRINTSUPP(var, name, desc) printf("\t%s - %s: %s\n", name, desc, _##var##_SUPP ? "yes" : "no")

然而,这里存在一个问题。宏将扩展为单行,预处理器会对此进行扼流。有没有办法在中间生成具有实际换行符的宏,还是可以在一行上评估#ifdef

3 个答案:

答案 0 :(得分:3)

如果您将其定义为HAVE_FOO,而不是定义0,则可以执行以下操作:

const struct {
    bool present;
    const char *name;
} features[NFEATURES] = {
    {HAVE_FOO, "foo"},
    {HAVE_BAR, "bar"},
    ...
};

for (size_t i=0; i < NFEATURES; i++)
    if (features[i].present)
        printf(" ... and we've got: %s\n", features[i].name);

您必须先检查#if HAVE_FOO而不是#ifdef HAVE_FOO,如果您的功能数量以数百万计运行,您的--help消息可能会显示得慢一些(其中)我总是推荐一个不同的架构。)

答案 1 :(得分:2)

你无法在C中执行此操作。通常的方法是从Perl或Python中的某些文本描述中生成这样的标题。

答案 2 :(得分:0)

您不能使用宏来创建另一个预处理指令。在宏扩展开始之前,所有预处理指令都被识别,因此您的宏将被解释为错误的C代码。