2011-01-06 78 views
2

我觉得很简单的问题,但我无法在网络上的任何地方找到任何关于它的讨论。我多年来多次看到三点作为函数参数,我一直认为它的意思是“不管你会坚持在这里”。直到昨晚,当我决定尝试与他们编译一个功能。令我惊讶的是,它在MSVC2010上没有警告或错误编译。或者至少,它似乎。我不确定,所以我想我会在这里问。虚拟虚拟foo(...)=“0”中的“...”是什么意思?

回答

7

它们是va_args或可变数量的参数。例如见The C book

+3

是的。请注意,它们是C时代的老黑客,因为缺乏类型安全性,所以在C++中并不推荐使用它。我的意思是,他们有他们的用途,但通常你可以用C++设施找到更好的选择。 (顺便说一句,麦克?来自gamedev.pl的麦克风?) – Kos 2011-01-06 14:25:14

+1

除了那些想抓住所有异常的那些懒惰的人! ;) – Nim 2011-01-06 14:28:37

+0

绝对,我个人尽量避免它们。不,我不是来自gamedev.pl的麦克风:) – Mic 2011-01-06 14:29:00

1

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

4

三点意味着功能是variadic(即接受可变数量的参数)。然而,要使用至少应该有一个参数...所以只有“...”不是一个可用的便携式声明。

仅仅因为重载的解析优先级(即声明只是为了使某个模板实例化失败或成功,而没有实现可变参数函数),C++模板中的欺骗函数使用了变量函数声明。这种技术被命名为Substitution failure is not an error (SFINAE)

+1

[SFINAE](http://en.wikipedia.org/wiki/SFINAE)的各种应用是使用后者的地方。 – 2011-01-06 14:43:53

+0

在答案中增加了链接谢谢。我不是这种手走技术的忠实粉丝,但肯定他们很受欢迎。 – 6502 2011-01-06 14:59:29

0

这意味着参数的类型和它们的数量是未指定的。你可能很熟悉的一个具体例子就像printf(char *, ...)

如果你使用printf,你可以在格式字符串之后放置任何你喜欢的东西,它不会被编译器强制执行。

例如printf("%s:%s",8),通过编译器就好像提供了“预期的”参数一样printf("%s:%s", "stringA", "stringB")

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