【问题标题】:When to use printf/scanf vs cout/cin?何时使用 printf/scanf 与 cout/cin?
【发布时间】:2011-12-08 11:12:55
【问题描述】:

我正在使用 MinGW 的 g++ 测试我在网上找到的一些 sn-ps。这是 C++ 编译器...为什么它会正确编译 C....为什么人们将 C 和 C++ 交织在一起。

具体的问题是:可以吗?同时使用 C 和 C++ 并在 g++ 下编译。如果答案是肯定的,这让我的生活变得轻松,因为我不必修改代码。

奇怪的是......要让一些 C++ 工作,特别是在将字符串传递给 ifstream 构造函数时,它需要一个 C 类型的字符串......

我的猜测是,因为 C++ 有时依赖于 C 结构,所以将这两种语言一起编写是可以的。

但是,就风格而言,您应该选择cout/cinprintf/scanf

【问题讨论】:

  • C 本质上是 C++ 的一个子集。到 C++ 出现时,C 中的代码已经有了(现在仍然如此),所以你不能期望这两种语言不兼容。
  • 注意:从 C++11 开始,您还可以从 const std::string& 构造 std::ifstream(例如,参见 last draft 的第 27.9.1.7 节)。

标签: c++ c printf iostream scanf


【解决方案1】:

有一些奇怪的地方需要char*。您可以使用std::string.c_str() 方法来弥补差距。

在大多数情况下,C++ 的 C 子集是兼容的。在大多数情况下,究竟如何不兼容并不重要:

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

如果您在 C++ 编译器下编译 C 代码的 sn-ps,请务必将其更改为在您的包含中使用“c”lib 格式...例如 #include <cstdio> 而不是 #include <stdio.h>

Is it bad practice to use a C header instead of its C++ equivalent in C++ (e.g. stdio.h instead of cstdio)?

对于 Bjarne 本人关于为什么要避免 scanf 的合理论证,请查看本文的开头:

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

使用 iostreams 代替 printf 也有很多好处:

'printf' vs. 'cout' in C++

【讨论】:

  • 好吧,他关于 printf 和 scanf 的论点似乎完全集中在 scanf 上。使用 printf 与 cout 在很大程度上是一个见仁见智的问题,因为它们都有优点和缺点。使用流格式化内容比必要的复杂得多,并且流的 OOP 方面可以隐藏错误(例如 cout << thiscout << *this)。
  • 更新了为什么不使用 printf 的支持链接。没关系尽可能,真的。但我仍然认为在字符串中使用未经检查的迷你格式化语言的概念与 C++ 精神背道而驰。这有点类似于我见过的情况,有人制作了一种“XML 格式”,它是一点点标题和 CDATA 的大块。那时您在一个 .XML file 中,但您的数据并不是真正的“XML”。如果您“使用 printf 语言编程”并绕过 C++ 类型系统并且不让所有内容在编译时得到检查,则同样如此。
  • 考虑到流接受几乎任何东西,我不太确定类型安全是否是一个很大的论据,因此您仍然可以轻松获得不需要的结果。 gcc 也使不匹配的参数列表不再是一个问题(它仍然是,尤其是在其他编译器上)。毫无疑问,在某些情况下能够继承 i/ostream 是件好事。有些人更喜欢一种语法而不是另一种语法,所以这对其中一个没有优势。我讨厌 C++ 中的流的一件事是它们的格式化能力。尝试使用流有效地执行%.*s 之类的操作。
  • 我非常 喜欢 使用一个设置了不变量的系统,这样如果我有一些调试代码,比如cout << "The value of x is " << x << endl;,那么它在我改变点时是健壮的x 的声明从整数到字符串,再到任何具有 iostream 方法的自定义类。这很好,还不错。 Printf 要求我记得进入并使用我可能进行的任何类型更改来触摸字符串,并且无法使窄格式语言可扩展。由于这些原因,它比 iostream 格式修饰符更能影响我的基础美学。 [耸肩]
  • 您可能会对这个问题感兴趣,因为这似乎是您的具体抱怨之一:stackoverflow.com/questions/6094309/…
【解决方案2】:

C++ 语言从 C 继承了许多核心功能。那是因为 C++ 是从 C 派生的。C++ 标准通过引用包含大部分 C 标准。因此,您可以使用 C++ 编译器使用 C 构造、习语和范式编写代码。这样做通常被称为“将 C++ 用作更好的 C”。

上面的长短是可以的,你可以在C++代码中使用printf。标准明确允许这样做。

但是,这样做通常会忽略许多定义 C++ 的特性。我将把谈话留到另一个问题上,但我只想说很多人会简单地告诉你“不要那样做”或“那不是 C++”。这排除了您可能不想在 C++ 程序中使用 printf 的原因,或者您确实想要使用的原因。但请放心,这在技术上是允许的。

【讨论】:

    【解决方案3】:

    可以吗?使用 C 和 C++ 并在 g++ 下编译。

    是的,可以混合两种语言。这在开始为 C 的代码中很常见,但随后添加了越来越多的 C++ 功能(显然有人在此过程中更改了编译器)。

    通常,C 代码将使用 C++ 编译器进行编译和运行。有许多可能的例外情况,例如在 C 代码中使用 classvirtual 等关键字作为事物名称,或者 C 的宽松转换规则。

    您会经常听到人们说“它们是非常不同的语言”。这是因为您提出的任何编程问题都可能有不同的答案,具体取决于您尝试使用的语言。但是,也有许多相似之处和向后兼容性方面。

    【讨论】:

    • 并非如此。 C 中有些东西不能编译为 C++。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2017-06-02
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2020-07-31
      相关资源
      最近更新 更多