最近我一直在查看很多别人编写的代码,注意到大家经常使用“printf”样式的C函数,但是在学校学习的C++函数(特别是cout)似乎不太流行。
这个观察是否正确?有什么原因吗?惯例吗?
谢谢,
R
最近我一直在查看很多别人编写的代码,注意到大家经常使用“printf”样式的C函数,但是在学校学习的C++函数(特别是cout)似乎不太流行。
这个观察是否正确?有什么原因吗?惯例吗?
谢谢,
R
个人而言,我更倾向使用 printf
而不是像 cout
这样的 iostream
工具,因为我认为它更加清晰。
当你使用 iostream
进行格式化时,你需要使用各种奇怪的东西,比如 setiosflags
和 setf
。我总是记不住这些东西存放在哪个命名空间中,更不用说所有这些都是做什么的了。即使我记得,我也会对代码显得冗长和不直观感到失望。
printf
的格式选项可能一开始看起来难以读懂,但它们简洁,并且在单个手册页面中有清晰的文档,并且是许多语言共有的。
另一个优点是 printf
是无状态的:与 cout
不同,我不需要记住哪些成员函数已经在 printf
上调用过,或者哪种复杂的标志组合被插入到其中。这对于可读性来说是一个很大的优势。
boost::format
。可以使用 boost::format
在 C++ 字符串中使用 printf 风格的标志。 - bdonlan我认为口味是可能的原因之一。就我个人而言,我发现这样:
printf("%8d: %s\n", customer->id, customer->name);
std::cout << customer->id << ": " << customer->name << std::endl;
还有本地化的问题。使用printf
可以更改格式以适应其他语言和UI文化,而使用iostreams
则变得非常繁琐,除非您使用类似Boost Format库这样的东西。
标准流系统存在一些批评,最值得注意的是它通常不如C语言的系统高效,并且它们不允许重新排序要格式化的项目,这可能会使本地化更加困难。
个人而言,我大多数情况下都使用流,因为它们允许我在不修改函数的情况下将函数写入控制台、文件或字符串。
boost::format
时使用带有printf格式说明符的流 :) - bdonlanFILE*
作为参数传递与传递ostream
参数一样容易。这允许fprintf
写入控制台或文件。 - gwellfmemopen()
。虽然它不是标准,但它确实存在。请参见http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_11.html#SEC166。 - gwellprintf
风格的格式。这是因为我们曾经大量使用MFC的CString
类及其printf
风格的Format
方法。我们正在逐步淘汰MFC,但尚未改变字符串格式化的方法。cout << *(int *)&foo;
。另一方面,任何像样的C编译器都会针对printf
格式字符串类型不匹配发出警告,因此我认为'safety'不是一个有效的论点。另一方面,与printf
相比,C ++流至少具有两个主要缺点:易于将消息本地化以进行翻译,并且无状态性(在线程中可能是一个大问题)。 - R.. GitHub STOP HELPING ICE我猜printf更广泛使用是因为:
iostreams
进行输入、输出或格式化。它们有其特点,但至少是类型安全的。 - Matthieu M.