1

有谁知道如何,或者甚至可以创建一个可变参数宏,如果它的参数不是定义的宏,则扩展为 0,但如果它的参数是定义的宏,则扩展为 1?(我使用的是 c99。)

#define BOB
#define SUE 45
#define IS_DEFINED(...) ???
IS_DEFINED(JOE)  <---- expands to 0
IS_DEFINED(BOB)  <---- expands to 1 (it's okay if this one doesn't work)
IS_DEFINED(SUE)  <---- expands to 1

编辑:我特别不想要任何#if相关的解决方案......它需要是一个可变参数宏(如果可能的话)所以我可以做这样的事情:

#define CAT_(x, y) x ## y
#define CAT(x, y) CAT_(x, y)
#define CLEANUP0(...) ABC  <--- treats __VA_ARGS__ one way
#define CLEANUP1(...) XYZ  <--- treats __VA_ARGS__ a different way
#define CLEANUP(...) CAT(CLEANUP, IS_DEFINED(DEFAULT))(__VA_ARGS__)

Where ABC&是其他处理方式非常不同XYZ的扩展的占位符。__VA_ARGS__

4

1 回答 1

1

您可以检查是否使用 定义了宏defined(),但这仅适用于工作的相同情况#ifdef(据我所知)。我认为这是不可能的,但我可能弄错了。

编辑:

我不知道这是否有助于您想要什么,因为结果不会是一个常量表达式。但是,如果您愿意,可以定义以下宏:

#define _IS_DEFINED(...) (!!*#__VA_ARGS__)
#define IS_DEFINED(...) _IS_DEFINED(__VA_ARGS__)
#define BOB

如果我们现在对此进行评估,我们将得到

int main() {
        printf("%d\n", IS_DEFINED(BOB));
}

这会给我们

0

这是因为IS_DEFINED(BOB)展开为(!!*"")。在这种情况下"",它只是指向NUL.data 部分中某个字节的指针,取消引用它将产生 0。但同样,这不是一个常量表达式,因此该值仅可用于 C 中的进一步使用,而不是预处理器。它也不会按照您的意愿评估第二种可能性(如示例所示)。

于 2021-03-09T13:01:15.127 回答