我觉得很简单的问题,但我无法在网络上的任何地方找到任何关于它的讨论。我多年来多次看到三点作为函数参数,我一直认为它的意思是“不管你会坚持在这里”。直到昨晚,当我决定尝试与他们编译一个功能。令我惊讶的是,它在MSVC2010上没有警告或错误编译。或者至少,它似乎。我不确定,所以我想我会在这里问。虚拟虚拟foo(...)=“0”中的“...”是什么意思?
回答
它们是va_args或可变数量的参数。例如见The C book
它被称为ellipses - 基本上说,该函数接受任何非类类型的任意数量的参数。
三点意味着功能是variadic(即接受可变数量的参数)。然而,要使用至少应该有一个参数...所以只有“...”不是一个可用的便携式声明。
仅仅因为重载的解析优先级(即声明只是为了使某个模板实例化失败或成功,而没有实现可变参数函数),C++模板中的欺骗函数使用了变量函数声明。这种技术被命名为Substitution failure is not an error (SFINAE)。
[SFINAE](http://en.wikipedia.org/wiki/SFINAE)的各种应用是使用后者的地方。 – 2011-01-06 14:43:53
在答案中增加了链接谢谢。我不是这种手走技术的忠实粉丝,但肯定他们很受欢迎。 – 6502 2011-01-06 14:59:29
这意味着参数的类型和它们的数量是未指定的。你可能很熟悉的一个具体例子就像printf(char *, ...)
如果你使用printf,你可以在格式字符串之后放置任何你喜欢的东西,它不会被编译器强制执行。
例如printf("%s:%s",8)
,通过编译器就好像提供了“预期的”参数一样printf("%s:%s", "stringA", "stringB")
。
除非确实需要,否则应该避免,因为它会产生运行时错误发生的可能性,否则可能会在编译时拾取错误。如果函数可以接受的参数有一个有限的,可枚举的变体,那么最好通过重载枚举它们。
- 1. 虚拟CPU是什么意思?
- 2. 将虚拟磁盘映像添加到虚拟机上的虚拟CD/DVD驱动器是什么意思?
- 3. YARN vcore中的虚拟内核是什么意思?
- 4. Docker镜像的虚拟大小是什么意思?
- 5. JVM连接API虚拟机。 “附加”是什么意思?
- 6. 硬件虚拟化扩展是什么意思?
- 7. 关于虚拟内存,“Dirty”和“Resident”是什么意思?
- 8. 什么是虚拟DOM?
- 9. 什么是虚拟内存?
- 10. 什么是oracle虚拟表?
- 11. 什么是虚拟代理?
- 12. 'echo 0> foo'是什么意思?
- 13. 在纯虚函数的衰减中,“= 0”是什么意思?
- 14. 什么是phpmyadmin中的`虚拟性'?
- 15. 什么是PHP中的“虚拟()”功能?
- 16. 虚拟内存的虚拟页面中包含什么?
- 17. foo是什么意思?
- 18. 虚拟方法不是演戏虚拟
- 19. 虚拟机中的虚拟机 - 网络
- 20. 什么是ENTER键的虚拟键码?
- 21. 什么是受保护的虚拟新
- 22. 什么是'='的虚拟键码?
- 23. 什么是go lang的虚拟继承?
- 24. 这是什么意思? int foo = foo + 4;
- 25. 虚拟机与虚拟桌面有什么不同?
- 26. 带空虚的虚拟方法和纯虚拟方法有什么区别?
- 27. 什么是“虚拟执行堆栈”?
- 28. 什么是虚拟适配器
- 29. phpInfo:“虚拟服务器”是指什么?
- 30. 什么是多重虚拟继承?
是的。请注意,它们是C时代的老黑客,因为缺乏类型安全性,所以在C++中并不推荐使用它。我的意思是,他们有他们的用途,但通常你可以用C++设施找到更好的选择。 (顺便说一句,麦克?来自gamedev.pl的麦克风?) – Kos 2011-01-06 14:25:14
除了那些想抓住所有异常的那些懒惰的人! ;) – Nim 2011-01-06 14:28:37
绝对,我个人尽量避免它们。不,我不是来自gamedev.pl的麦克风:) – Mic 2011-01-06 14:29:00