【问题标题】:Variable Arity in C?C中的可变Arity?
【发布时间】:2010-11-25 10:02:05
【问题描述】:

有谁知道我如何能够在 C 中为函数实现可变参数?

例如求和函数:

总和(1,2,3,4...); (接受可变数量的参数)

谢谢!

【问题讨论】:

  • 什么变量?函数?
  • 请更具体地说明您想要什么。示例代码(无需编译,只需演示您想要实现的目标,以及您希望它的理想外观)将非常有帮助。
  • 平价,也许?在什么情况下?告诉我们更多。
  • 正确,函数。编辑了我的评论。
  • 为了将来参考,“可变参数”函数在 C/C++ 中通常称为“var-args”(可能是“可变参数”的缩写,也可能来自所用宏的名称创建这样的函数,而这些函数又是这样的收缩)

标签: c


【解决方案1】:

整数的可变参数列表。根据需要调整类型:

#include <stdarg.h>

void myfunc(int firstarg, ...)
{
    va_list v;
    int i = firstarg;

    va_start(v, firstarg);
    while(i != -1)
    {
        // do things
        i = va_arg(v, int);
    }

    va_end(v);
}

您必须能够确定何时停止读取变量 args。这是通过终止参数(在我的示例中为 -1)或通过了解来自其他来源的预期参数数量(例如,通过检查 printf 中的格式化字符串)来完成的。

【讨论】:

    【解决方案2】:

    如果所有附加参数的类型相同,您也可以传递一个数组而不是使用可变参数宏。

    使用 C99 复合文字和一些宏魔法,这看起来很不错:

    #include <stdio.h>
    
    #define sum(...) \
        sum_(sizeof ((int []){ __VA_ARGS__ }) / sizeof (int), (int []){ __VA_ARGS__ })
    
    int sum_(size_t count, int values[])
    {
        int s = 0;
        while(count--) s += values[count];
        return s;
    }
    
    int main(void)
    {
        printf("%i", sum(1, 2, 3));
    }
    

    【讨论】:

    • +1 这是最好的方法,我经常使用它。但如果您提供空参数列表,它将失败。要绕过它,请使用以下语法来计算参数数量:“sizeof((int[]){0, ##__VA_ARGS__})/sizeof(int)-1”。如果列表为空,##__VA_ARGS__ 会吃掉前面的逗号。
    • @qrdl:您还必须修改__VA_ARGS__ 的第二个扩展,即将(int []){ __VA_ARGS__ } 替换为&amp;((int[]){ 0, ##__VA_ARGS__ })[1];大多数情况下,我不会打扰并接受它不适用于空宏调用......
    • 这看起来很丑……我也不得不接受这里接受的答案
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      如果您正在尝试实现可变的 arity 函数,请查看 http://www.cprogramming.com/tutorial/lesson17.html 的介绍。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多