默认参数和可变参数函数

11
有没有办法在可变参数函数中指定默认参数?(同样适用于模板)

你试图解决什么实际问题?使用哪种编程语言? - GManNickG
你的整个问题明显是关于C++而不是C的。在C中没有函数的默认参数(就像你似乎假设的那样使用=something符号),也没有模板(正如Kirill已经指出的那样)。 - Jens Gustedt
4个回答

9

在C++中,您可以使用基于命名参数惯用语法的函数替换可变参数函数。

请参见C++ FAQ条目10.20 什么是“命名参数惯用语法”?

这样可以为您提供默认功能和方便的符号表示方法。

祝好!


3

为什么你需要变参和默认参数?

举个例子,

myFunc(int a=5, int b=5, int c=5);

可以接收0-3个参数,带有默认值。

myFunc(...)

这个函数可以接收任意数量的参数。在函数内部,您可以检查缺少的参数并根据需要填充默认值。


3

首先是C++的答案。

默认参数是指函数应该并且将会看到提供的参数。因此,您应该明确命名这些参数,然后可以提供默认参数。这将是您函数的“简短”版本。

如果除了这些默认参数之外,您还想拥有一个va_arg参数列表的可能性,只需重载您的函数以提供完全相同的功能即可。对于这个“长”版本,您无论如何都必须提供所有参数,因此在这里使用默认参数没有任何意义。

现在是C语言的答案

也许您并没有考虑过这样一件事情,但是使用C99的va_arg宏特性,也可以为C语言中的函数定义默认参数。在这种情况下,宏语法比C++更加宽松,因为您可以省略函数调用中间的参数,而不仅仅是在末尾省略。因此,如果您声明函数类似于以下方式:

int toto(int a, ...)

如果你指定了第二和第三个位置的默认参数,那么你可以这样调用它:

toto(4,5,,,37);

因此,在C语言中,可以做到您所要求的。但我个人肯定会犹豫不决。


据我理解,C++不支持可变参数函数。 - Alexander Rafferty
@Alexander:它们可能是语言的边角案例,但无论出于什么原因,它们仍然存在。 - Jens Gustedt
哦,C++确实有可变参数。我以为这只是C语言的东西,就像VLA一样。 - Alexander Rafferty
va_arg宏特性能在C++中使用吗? - aCuria
你可以在C++中使用va_arg,但它并不是很好,唯一安全的使用方法是将其包装在一个宏中,并用零参数终止该事物,通常没有办法做到这一点,例如printf只查看有多少格式化程序并假定有那么多参数,我认为有一些编译器优化可以做到这一点,但像我说的那样,不太安全。请查看__VA_ARGS__宏,您可以使其更安全(不是完全安全,因为其他人仍然可以调用您的宏,并且在宏的访问控制方面没有任何控制)。我建议避免使用va_args… :) - osirisgothra

2

没有办法做到这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接