可变参数的 C 宏

标签 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;
}

我只是好奇如何用 Macro 来做。

最佳答案

I am just curious about how to do it with Macro.

你不能。 va_list可变参数函数 访问其参数的一种方式。你写的是一个可变参数宏。它们不一样(特别是可变参数宏仍然只是一种语法上的便利,不能让您处理单个参数)。做你想做的事情的唯一方法是在可变参数宏中调用你自己设计的可变参数函数(然后你还不如删除宏)。

但是,如果您真的坚持使用可变参数宏,结果证明您很幸运,在宏参数和数组初始值设定项中使用了相同的分隔符 ,,因此您可以尝试类似:

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

关于可变参数的 C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29050280/

相关文章:

c - MPU9150 中的磁力计传感器错误

c - 如何区分以太网和其他以太网?

c - 中断处理程序是否有超时?

c - %X 表示整数的格式说明符

c - 使用 'for' 和 'while' 循环时出现问题

c - 如何将两个不等数组的每个元素相加并将其存储在第三个数组中?

从 gcc 的中间文件编译目标文件

mysql - 使用 mysql_config 和 pkg-config 编译代码

c - 在 `sock_fd` 函数中使用哪个 `setsockopt`

c - 放弃(root)特权后,fork()ing 是否有任何安全优势?