C宏与varargs

Zac*_*ack 3 c

我正在尝试编写一个宏,它返回几个整数的最小值.当我编译以下代码时,它会抛出错误"expected expression".我不知道那里有什么问题.有人能指出这段代码的问题吗?

#define SMALLEST (nums, (ret_val), ...)          \
do {                                             \
    int i, val;                                  \
    va_list vl;                                  \
    va_start(vl,nums);                           \
    (*ret_val) = va_arg(vl, int);                \
    for (i = 1; i < nums; i++)                   \
    {                                            \
        val=va_arg(vl, int);                     \
        if ((*ret_val) > val)                    \
            (*ret_val) = val;                    \
    }                                            \
    va_end(vl);                                  \
} while(0)

int main ()
{
  int nums = 3;
  int ret_val = 0;
  SMALLEST(nums, &ret_val, 1, 2, 3);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我只是对如何使用Macro感到好奇.

Pas*_*uoq 7

我只是对如何使用Macro感到好奇.

你不能.va_list是一种可变函数访问其参数的方法.你写的是一个可变宏.它们不一样(特别是可变参数宏仍然只是一种语法上的便利,不允许你处理单个参数).做你想做的事的唯一方法是在可变参数宏中调用你自己设计的可变参数函数(然后你也可以消除宏).

但是,如果你真的坚持使用可变参数宏,那么你很幸运,在宏参数和数组初始值设定项中使用了相同的分隔符,所以你可以尝试这样的:

#define F(X, ...) \
  do { \
    int t[] = { __VA_ARGS__ }; \
    for (int i = 0; i < sizeof t / sizeof t[0]; i++) \
      … \
  } while (0)
Run Code Online (Sandbox Code Playgroud)