检测C宏中是否存在参数
如何定义一个C宏检测C宏中是否存在参数,c,c-preprocessor,variadic-macros,C,C Preprocessor,Variadic Macros,如何定义一个C宏IFARGS(YES,NO,…),使得调用IFARGS而不使用其他参数生成NO,调用IFARGS而使用一个或多个参数生成YES 我有一个使用GCC的答案(见下文),但如果可能的话,我更喜欢C99的答案(或者证明它不可能) 请注意,如果这在C99中是可能的,那么就可以模拟###uuu VA_uargs_uuu,如下所示: #define PREPEND_COMMA(...) , __VA_ARGS__ #define NO_COMMA() #define PREPEND_COMMA
IFARGS(YES,NO,…)
,使得调用IFARGS
而不使用其他参数生成NO
,调用IFARGS
而使用一个或多个参数生成YES
我有一个使用GCC的答案(见下文),但如果可能的话,我更喜欢C99的答案(或者证明它不可能)
请注意,如果这在C99中是可能的,那么就可以模拟###uuu VA_uargs_uuu
,如下所示:
#define PREPEND_COMMA(...) , __VA_ARGS__
#define NO_COMMA()
#define PREPEND_COMMA_IF_NONEMPTY(...) IFARGS(PREPEND_COMMA, NO_COMMA, __VA_ARGS__)(__VA_ARGS__)
然后,任何
,####(uu VA_ARGS)(uu VA_ARGS)(uu VA_ARGS)的实例都可以用逗号(uu非空)(u VA_ARGS)在C99中,可以检测宏参数是否为空,但使其对该参数中可能出现的所有可能性(参数本身正在扩展,包含()
之类的东西)很难。我的宏包实现了这一点,所以您不必太担心。有了它,您的宏可以实现为
#define IFARGS(YES, NO, ...) P99_IF_EMPTY(__VA_ARGS__)(YES(__VA__ARGS__))(NO())
正如其名称所示,P99只是基于C99的功能来实现这一点。这不是一个真正的答案,而只是对您自己问题的补充。@JensGustedt第一个代码框是一个部分解决方案——它具有所需的行为,但需要\uu VA_uargs\uu
,这是C99宏语法的GCC扩展。我注意到了。对SO的一点研究可能会给你一个答案。请看上面的链接。@JensGustedt,如果你能想到一个不需要GCC的IFARGS
实现,请在这里发布!!这真的很酷,因为正如我在上面所证明的,任何可以用###uu VA_uargs_uu
实现的宏都可以用IFARGS
实现。我做到了,你没有看到我的答案吗?如果你想扩展对P99\If\u EMPTY
的引用,你必须自己做。我觉得你的界面IFARGS
不够有趣,我自己也做不到。你怎么能在C99中检测到一个空参数?@augurar,这是我最喜欢的搜索引擎的顶级搜索:)有趣;然而,当给出16个参数时,文章中的ISEMPTY
宏似乎失败了。对于实际应用程序,这是一个很好的解决方案。我仍然对理论上的问题感兴趣,###uu VA_uargs uu
是否真的为宏语言添加了任何“力量”,或者它是否只是一个方便的功能。@augurar,那你为什么不问这个问题?
#define IFARGS(YES, NO, ...) P99_IF_EMPTY(__VA_ARGS__)(YES(__VA__ARGS__))(NO())