虚拟空虚foo(...)= 0中的“...”是什么意思?

时间:2011-01-06 14:19:36

标签: c++

我认为这是一个非常简单的问题,但我无法在网络上的任何地方找到任何关于它的讨论。多年来我多次看到三点作为功能参数,我一直认为这意味着“无论你想坚持什么”。直到昨晚,我决定尝试用它们编译一个函数。令我惊讶的是,它在MSVC2010上没有警告或错误编译。或者至少,它似乎。我不太确定,所以我想我会在这里问。

4 个答案:

答案 0 :(得分:7)

它们是va_args或可变数量的参数。请参阅示例The C book

答案 1 :(得分:4)

三点表示函数为variadic(即接受可变数量的参数)。但是要使用它应该至少有一个参数...所以只有“...”不是一个可用的便携式声明。

有时可变参数函数声明在C ++模板技巧中使用仅仅是因为重载的解析优先级(即声明这些函数只是为了使某个模板实例化失败或成功,可变参数函数本身未实现)。此技术名为Substitution failure is not an error (SFINAE)

答案 2 :(得分:1)

它被称为ellipses - 基本上说该函数接受任何非类型类型的任意数量的参数。

答案 3 :(得分:0)

这意味着参数类型及其数量未指定。您可能熟悉的具体示例类似于printf(char *, ...)

如果您使用printf,您可以在格式字符串后放置任何您喜欢的内容,编译器不会强制执行。

e.g。 printf("%s:%s",8),通过编译器就像提供“预期”参数一样printf("%s:%s", "stringA", "stringB")

除非确实有必要,否则应该避免,因为它会产生运行时错误的可能性,否则可能会在编译时被拾取。如果函数可以接受的参数存在有限的,可枚举的变化,那么最好通过重载来枚举它们。