何时使用printf/scanf和cout/cin?

8
我正在使用来自MinGW的g++测试一些从网上找到的片段。这是C++编译器...那么为什么它可以正确编译C....为什么人们要交织使用C和C++。
具体问题是:是否可以同时使用C和C++并在g++下编译。如果答案是肯定的,这会让我的生活变得容易,因为我不需要修改代码。
奇怪的是......要使一些C++正常工作,特别是将字符串传递给ifstream构造函数时,它需要一个C类型的字符串......
我的猜测是,因为C++有时依赖于C结构,所以写两种语言在一起是可以的。
然而,作为一种风格问题,您应该选择cout/cin或printf/scanf。

C实质上是C++的一个子集。当C++出现时,已经有大量的C代码(现在仍然有),因此不能期望将这两种语言变得不兼容。 - FailedDev
1
注意:自C++11起,您还可以从const std :: string&构造std :: ifstream(例如,请参见最新草案的第27.9.1.7节)。 - reima
4个回答

5

一些情况下需要使用char*。 您可以通过使用std::string.c_str()方法来弥补差距。

在大多数情况下,C++的C子集是兼容的。 它不兼容的确切方式可能不重要:

http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B

如果您正在使用C++编译器编译C代码片段,请确保将其更改为使用 "c" lib格式的包括...例如 #include <cstdio>而不是#include <stdio.h>

在C++中使用C头文件而不是其C++等效文件是不好的做法吗?(例如,使用stdio.h而不是cstdio.h)

对于一个相当有理性的论点,Bjarne本人为什么要避免使用scanf,请查看本文的开头:

http://www.stroustrup.com/new_learning.pdf

使用iostreams而不是printf还有很多好处:

'printf'和'cout'在C++中的区别


他的关于printf和scanf的论点似乎完全集中在scanf上。使用printf与cout之间的选择很大程度上是个人观点问题,因为它们都有优缺点。使用流格式化东西比必要的复杂得多,而流的面向对象编程方面可能会隐藏错误(例如cout << this vs. cout << *this)。 - Voo
我不确定类型安全性是否是一个很好的论点,因为流可以接受几乎任何东西,所以你仍然可以轻松地得到不想要的结果。此外,gcc使非匹配参数列表变得不那么成问题(尤其是在其他编译器上)。能够继承i/ostream在某些情况下确实很好。有些人更喜欢一种语法而不是另一种,所以这对于其中的一方来说并不是优势。我厌恶C++中流的格式化能力。试着用流高效地做像%.*s这样的事情。 - Voo
我非常喜欢使用一个系统,它的不变量被设置得如此之好,以至于如果我有一些调试代码,比如 cout << "The value of x is " << x << endl;,那么无论我将 x 的声明点从整数更改为字符串,或者更改为任何具有 iostream 方法的自定义类,它都能够很好地工作。这是好的,而不是坏的。Printf 要求我记住去触及任何类型更改的字符串,而且狭窄的格式化语言不能被扩展。因为这些原因,它在根本上违反了我的审美观。[耸肩] - HostileFork says dont trust SE
这个问题可能会引起你的兴趣,因为它似乎是你特定投诉之一:https://dev59.com/JVfUa4cB1Zd3GeqPIXga - HostileFork says dont trust SE
StackOverflow认为我们在评论中说得太多了。这里有一个新问题:https://dev59.com/P1zUa4cB1Zd3GeqP1kQI - HostileFork says dont trust SE
显示剩余2条评论

3
C++语言的核心功能很大程度上继承自C语言。这是因为C++是从C语言演化而来的。C++标准通过引用C标准,包含了大量的C标准内容。因此,您可以使用C++编译器编写使用C结构、习惯和范例的代码。这通常被称为将C++“作为更好的C”使用。
总之,您可以在C++代码中使用printf函数。这是标准明确允许的。
然而,这样做通常会忽略定义C++的许多特性。我将把这个问题留给另一个问题,但可以说许多人会告诉您简单地“不要这样做”或“那不是C++”。这搁置了您可能不想在C++程序中使用printf函数或者为什么要使用它的原因。但请放心,从技术上讲,这是允许的。

2
可以同时使用C和C++并在g++下编译。这在最初使用C语言编写的代码中很常见,但后来逐渐添加了更多的C++特性(显然是在改变编译器的过程中)。通常情况下,C代码可以使用C++编译器进行编译和运行。可能会有一些例外,例如在C代码中使用关键字class和virtual作为名称,或者C松散的转换规则。你经常会听到人们说“它们是非常不同的语言”。这是因为任何你问的编程问题可能因为你尝试使用的语言而有不同的答案。然而,也有许多相似之处和向后兼容的方面。

1
不完全是这样。在C语言中有些东西在C++中无法编译通过。 - Cat Plus Plus

0
如果你使用C++,那就用C++(cin,cout)。 为什么fstream要使用c字符串也让我感到困惑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接