函数参数列表中的三个点是什么意思?

新手上路,请多包涵

我遇到了一个函数定义,例如:

 char* abc(char *f, ...)
{
}

三个点是什么意思?

原文由 ashishsony 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3k
2 个回答

这些类型的函数称为 _可变参数函数_( 维基百科链接)。他们使用省略号(即三个点)来表示函数可以处理的参数数量不定。您可能使用过此类功能的一个地方(可能没有意识到)是使用各种 printf 功能,例如(来自 ISO 标准):

 int printf(const char * restrict format, ...);

The ellipses allow you to create functions where the number of parameters are not known beforehand, and you can use stdargs.h functions ( va_start , va_arg and va_end ) 来获取具体的论点。

你必须知道你提取的参数的 _类型_,并且有一些方法来决定你什么时候完成。 printf 函数使用格式字符串(对于类型和计数)执行此操作,而我下面的示例代码始终假定 const char * 作为具有标记值的类型 NULL 决定完成。

这里 的这个链接有一篇关于在 printf 中使用变量参数列表的很好的论文。


例如,以下程序包含一个函数 outStrings() ,它允许您打印任意数量的字符串:

 #include <stdio.h>
#include <stdarg.h>

void outStrings(const char *strFirst, ...) {
    // First argument handled specially.

    printf("%s", strFirst);
    va_list pArg;
    va_start(pArg, strFirst);

    // Just get and process each string until NULL given.

    const char *strNext = va_arg(pArg, const char *);
    while (strNext != NULL) {
        printf("%s", strNext);
        strNext = va_arg(pArg, const char *);
    }

    // Finalise processing.

    va_end(pArg);
}

int main(void) {
    char *name = "paxdiablo";
    outStrings("Hello, ", name, ", I hope you're feeling well today.\n", NULL);
}

原文由 paxdiablo 发布,翻译遵循 CC BY-SA 4.0 许可协议

它们被称为省略号,它们意味着该函数可以采用不确定数量的参数。您的函数可能可以这样调用:

 abc( "foo", 0 );
abc( "foo", "bar", 0 );

需要有一种方法来指示列表的结尾。这可以通过使用第一个参数来完成,作为 ion 一个 printf(0 格式字符串,或者通过一个特殊的终止符,在上面的示例中为零。

具有可变数量参数的函数在 C++ 中被认为是错误的形式,因为不能对参数执行类型检查或用户定义的转换。

原文由 anon 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题