我最近浏览了很多其他人编写的代码,碰巧注意到每个人都经常使用“printf”风格的 C 函数,但是在学校学习的 C++ 函数(特别是 cout)似乎并不那么受欢迎。
这是一个有效的观察结果吗?这有什么原因吗?习俗?
谢谢,
R
我最近浏览了很多其他人编写的代码,碰巧注意到每个人都经常使用“printf”风格的 C 函数,但是在学校学习的 C++ 函数(特别是 cout)似乎并不那么受欢迎。
这是一个有效的观察结果吗?这有什么原因吗?习俗?
谢谢,
R
就个人而言,我使用printf
这些iostream
东西(如cout
),因为我认为它更清晰。
当您使用 进行格式化时iostream
,您必须使用<<
各种奇怪的东西,例如setiosflags
和setf
。我永远记不起所有这些东西都存在于哪个命名空间中,更不用说它们的作用了。即使我这样做了,我也对代码看起来多么冗长和不直观感到失望。
格式选项printf
一开始可能看起来难以辨认,但它们简洁明了,在一个手册页中清楚地记录,并且对多种语言都是通用的。
另一个优点是printf
无状态:与 with 不同cout
,我不需要记住哪些成员函数已被调用printf
,或者哪些标志的拜占庭混合物已被<<
编入其中。这是可读性的一大优势。
我认为口味是可能的原因之一。我个人认为:
printf("%8d: %s\n", customer->id, customer->name);
比这更具可读性:
std::cout << customer->id << ": " << customer->name << std::endl;
还有本地化的问题。printf
可以更改格式以适应其他语言和 UI 文化,这成为 . 的主要工作iostreams
,除非您使用Boost Format库之类的东西。
对标准流系统有一些批评——最值得注意的是,它通常不如 C 系统的性能好,而且它们不允许对要格式化的项目进行重新排序,这会使本地化更加困难。
就个人而言,我对大多数事情都使用流,因为它们允许我将函数写入控制台、文件或字符串,而无需修改函数。
在我工作的地方,我们使用printf
-style 格式。这是因为我们曾经大量使用 MFCCString
类及其printf
-styleFormat
方法。我们一直在逐步淘汰 MFC,但没有改变我们的字符串格式化方法。
至于哪个设计得更好,请参阅谁设计/设计了 C++ 的 IOStreams,按照今天的标准,它是否仍然被认为设计得很好?
printf 和 scanf 系列函数有两个主要问题:类型安全和内存安全。在规范字符串和后面的可变长度参数列表之间产生不匹配是相当容易的。此外,通过 scanf 的缓冲区溢出是一个典型的安全漏洞。简而言之,不要使用它们。
C++ 流提供类型和内存安全,以及格式可扩展性。它们比 printf 和 scanf 更强大且通常更易于使用。
此外,正如 ShaderOp 所建议的,Boost 的格式库提供了相同的安全性,但让老 C 程序员感觉更舒服。
我猜 printf 使用更广泛,因为