Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测C宏中是否存在参数_C_C Preprocessor_Variadic Macros - Fatal编程技术网

检测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

如何定义一个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_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())