【发布时间】:2021-03-09 12:46:05
【问题描述】:
有谁知道如何创建一个可变参数宏,如果它的参数不是定义的宏,则扩展为 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__)
其中ABC 和XYZ 是其他扩展的占位符,它们对__VA_ARGS__ 的处理方式非常不同。
【问题讨论】:
-
#if defined(JOE)? -
我的意思是我不明白为什么,但是如果您想使用可变参数宏而不是
#ifdef或#if defined()您可以使用更强大的预处理器(例如 m4)来创建可以具有#ifdef也许在其中。不过好像有点过分了。您是否有任何具体原因需要这样做,所以也许更容易找到解决方案?
标签: c c-preprocessor metaprogramming variadic-macros p99