【问题标题】:What does "..." in c function declaration mean?c函数声明中的“...”是什么意思?
【发布时间】:2011-11-14 04:55:49
【问题描述】:

我正在浏览 MinGW 附带的 stdio.h 头文件,并注意到 printf 函数是这样声明的:

int printf (const char *__format, ...)
{
    //body omitted
}

我之前从未在函数参数列表中看到省略号,所以我尝试了一下。它编译并运行没有错误。那么,“……”的目的是什么?

【问题讨论】:

    标签: c function mingw printf declaration


    【解决方案1】:

    这意味着该函数是一个可变参数函数,它接受可变数量的参数:

    http://en.wikipedia.org/wiki/Variadic_function

    printf() 本身可能是可变参数函数的最佳示例。

    【讨论】:

    • 哇。我不知道 c 有这些,现在尝试一下。谢谢。
    • 如果你想实现一个可变参数函数,你需要使用stdarg.h来访问参数。所以它不像普通函数那么简单。
    • 你说得对,与其他语言相比,它一点也不简单。即使使用 Wikipedia 示例,我也花了几分钟时间编写 sum 函数。无论如何,很高兴知道它在那里。有总比没有好:)。
    【解决方案2】:

    它通知编译器该函数有一个可变参数列表。这是一项仅适用于 __cdecl 调用约定的功能。它允许调用者在最后一个固定参数之后指定它想要的任何参数值,因为调用者将在函数退出时清理参数。可变参数通常用于 printf 样式的函数,其中可变参数值的解释取决于固定参数值的值(例如将单个可变参数与__format 参数中的每个格式说明符匹配)。

    【讨论】:

      【解决方案3】:

      它用于允许可变数量的参数或未指定类型的参数,如printf() 所做的那样。允许可变数量 argumnets 的函数称为Variadic Function

      可变变量通过va_startva_listva_endva_arg 访问

      Variable number of Arguments (...)

      Sample Implementation:

      #include <stdarg.h>
      
      double average(int count, ...)
      {
          va_list ap;
          int j;
          double tot = 0;
          va_start(ap, count); //Requires the last fixed parameter (to get the address)
          for(j=0; j<count; j++)
              tot+=va_arg(ap, double); //Requires the type to cast to. Increments ap to the next argument.
          va_end(ap);
          return tot/count;
      }
      

      希望这会有所帮助。

      【讨论】:

      • 请解释va_list ap;va_end(ap);这行。提前谢谢你。
      • va_list 和 va_end 是在 stdarg.h 库中定义的宏,va_list 用于参数指针(ap)变量。而 va_end(ap) 结束参数指针的使用。在 va_end 调用之后,同一个 ap 的进一步 va_arg 调用可能无法正常工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 2021-11-23
      相关资源
      最近更新 更多