【发布时间】:2019-06-12 02:17:18
【问题描述】:
我想定义一个这样的宏
#define ASSERT_EXIST(error, ...) some-impl-here
那么我们可以这样称呼它
ASSERT_EXIST(100, a, b, c)
它应该扩展到这个
if (!a_exists) return error("a is missing", 100);
if (!b_exists) return error("b is missing", 100);
if (!c_exists) return error("c is missing", 100);
其中最麻烦的部分是我无法在宏中轻松迭代 __VA_ARGS__。
【问题讨论】:
-
您需要限制可以传递给
ASSERT_EXIST宏的变量数量。 AFAIK,没有办法编写一个可以扩展所有传递给它的参数的宏。 -
查看Boost Preprocessor 库(名义上适用于C++,但也完全适用于C)。它具有处理这些要求的工具,至少对于合理大小的参数列表而言。如果您坚持使用 300 个参数,您可能需要做一些额外的工作。另请参阅Macro returning the numnber of arguments it is given in C 和相关问题。
标签: c macros variadic-functions