【问题标题】:Why doesn't a simple "Hello World"-style program compile with Turbo C++?为什么一个简单的“Hello World”风格的程序不能用 Turbo C++ 编译?
【发布时间】:2021-01-20 22:30:43
【问题描述】:

我已经开始为我的编程课学习 C++。我已经下载了这个“Hello World”程序:

#include <iostream>
using namespace std;

int main() 
{
    cout << "Hello, World!";
    return 0;
}

但 Turbo C++ 抱怨:

Error D:\HELLO.CPP 1: Unable to open include file 'IOSTREAM'
Error D:\HELLO.CPP 2: Declaration syntax error
Error D:\HELLO.CPP 6: Undefined symbol 'cout'

这个非常简单的程序有什么问题?我该如何纠正这些错误?

【问题讨论】:

  • 这是一个标准的欺骗重定向,用于询问有关 Turbo C++ 问题的问题。这些问题中的许多往往会在 cmets 中仅通过简短的解释就被迅速击落,而它们确实可以使用正确的答案。欢迎改进。
  • 建议提及您使用的是哪个版本的 Turbo C++。 2006 年的版本对应了这个程序。
  • “我已经开始为我的编程课学习 C++。”。这是个谎言。期间。
  • @bugwheels94 See this.
  • @n.m.我不知道 bugwheells 是不是这个意思,但我认为他们的意思是,如果教一个人 TurboC++(特别是无法编译的旧 TurboC++),那么他们就没有学习 C++(包括我在内的很多人都隐含地认为是标准 C++)。

标签: c++ turbo-c++ c++-faq


【解决方案1】:

这个程序没有问题。 (可能除了一些风格问题—— using namespace std 不推荐)。问题在于 Turbo C++。这是一个非常古老的软件。它实现了一种 C++ 方言,即所谓的 pre-ANSI C++,在本世纪初完全停止使用。 C++ 的第一个 ANSI 标准于 1998 年发布,然后是 2003 版、2011 版、2014 版、2017 版,现在我们期待 2020 版正式发布。这些标准修订中的每一个都或多或少地对语言进行了重大更改。

对于 Turbo C++,您必须像这样修改程序:

#include <iostream.h>      // note the .h suffix
// using namespace std;    // Turbo C++ doesn't implement namespaces

int main() 
{
    cout << "Hello, World!";
    return 0;
}

如果您查看这个程序,现代 C++ 方言与 Turbo C++ 所接受的方言之间的差异似乎很小。但是,随着您的程序变得越来越复杂,它会变得越来越大。

虽然您可以学习使用 Turbo C++ 进行编程,但由于以下问题,我强烈建议您避免这种情况:

  1. 您将学习一种与行业中使用的流行语言有些相似但又非常不同的语言,这是没有充分理由的。如果你打算为真正的软件开发编写 C++,你将不得不重新学习很多东西。立即学习现代 C++ 要容易得多。
  2. 目前没有关于 Turbo C++ 的文献。几乎 100% 的 C++ 材料,您可以在 Internet 上或书籍中找到,并不直接适用于开箱即用的 Turbo C++。有些只需要稍作调整,而其他材料则完全无法使用。几乎可以立即获得的唯一帮助来源是内置的 Turbo C++ 帮助。
  3. 很少有人记得 Turbo C++。在论坛上提问时,请始终指定您使用的是 ANSI 之前的方言,以便过滤掉针对该语言的现代版本的响应。您可能会收到一堆 cmets 建议您立即停止并在您提出每个问题时切换到现代编译器。

您可以使用许多现代免费(如beer 和speech)编译器和IDE 来代替Turbo C++。其中包括:

  1. Visual C++ Community Edition 是 Microsoft 的 IDE 和编译器
  2. Code::Blocks 是一个轻量级的 IDE。在 Windows 上,它附带了一个有点过时的编译器,但您可以自己安装更现代的编译器
  3. Eclipse CDT 是一个强大的跨平台IDE。它不附带自己的编译器,因此您需要安装单独的编译器。在 Windows 上,使用例如MinGW。
  4. Many more
  5. 此外,还有很多在线编译器,例如http://ideone.com、https://www.onlinegdb.com/ 和http://coliru.stacked-crooked.com/,以及many more(这些主要用于尝试想法和编写非常小的程序)。
  6. Clang/LLVM 和 GCC 都是支持最新 C++ 版本的 free software 编译器。

遗憾的是,即使在这个时代,一些学校/老师似乎也强迫学生使用 Turbo C++。不幸的是,这不是这个社区可以解决的。如果您发现自己处于这种情况,请做好无法获得太多外部帮助的准备。

【讨论】:

  • @Rakete1111 我认为这更像是“这个程序按照当前标准没有问题”。是否有好的编程风格是另一回事。
  • @Rakete1111 responsible 使用using namespace std 没有任何问题。将它教给新的程序员可能是一个好的教学决定,也可能不是一个好的教学决定,但它本身在道德上并没有错。
  • 我同意 using namespace std 是不好的做法,但我认为它属于这个问题,因为您在网上找到的 C++ hello world 程序几乎总是这样做。因此,重要的是要清楚这并不是使 Turbo C++ 不高兴的原因。也许不是“这个程序没有问题”而是说“这个程序是有效的,根据当前 C++标准;它应该编译。”
  • @Puppy 同理,所有对标准函数的调用都是不负责任的,因为你不知道会添加什么新的重载。您也不知道下一个标准中哪些语言特征会消失或改变含义。并非所有程序都需要存活数十年或可移植到任意编译器。
  • “很少有人记得 Turbo C++” 我不同意。 今天,至少有一个完整的大国正在积极教授它。
【解决方案2】:

“Turbo C++”可能意味着许多编译器。在问这个问题时,重要的是要包括版本号。

  • 直到 3.1 版的 Borland Turbo C++ 是经典蓝色背景 IDE 中的纯 MS DOS 编译器。它们大约是在 1989 年到 1992 年之间发布的,早在 C++ 标准化之前很久,这发生在 1998 年。所以他们使用了 C++ 的标准方言。

    最值得注意的是,他们使用 #include &lt;iostream.h&gt; 语法而不是标准的 #include &lt;iostream&gt;,但也没有涵盖很多 C++ 功能,例如命名空间、模板等。模板库 STL 还不是标准的一部分,因此与该库相关的所有内容都与后来成为标准的内容大不相同。

  • 在 90 年代后期,Borland 发布了几个一致性更好的 DOS/Windows 编译器。直到第 5 版,他们仍然在努力完全符合 C++98,尽管这些 Windows 版本非常接近它。

  • 在 90 年代后期,他们放弃了“Turbo C++”这个名称,取而代之的是 Borland C++ Builder,它不仅仅是一个 IDE,而是一个基于 Delphi 的完整 RAD 工具。这些编译器完全兼容 C++98 和更高版本的 C++03。

  • 2005 年左右,Borland 放弃了将编译器作为其产品线的一部分。编译器变成了“Codegear”,后来变成了 Embarcadero。大约在那个时候,他们发布了一个免费版本的 Borland Builder,他们将其命名为“Turbo C++”。该版本完全符合C++03。

  • 如今,这些编译器被称为 Embarcadero C++ Builder。我相信他们目前支持 C++11 和一些 C++14。 More info here.

不用说,作为一名学生,除了现代编译器之外,您不应该使用任何东西。在 2018 年学习 C++ 时使用 1991 年的 MS DOS 编译器简直是疯了。它不仅适得其反,而且直接有害,会让你成为一个糟糕的 C++ 程序员。如果你的学校强迫你使用 Turbo C++ 3.1 或更高版本,那么你的学校很糟糕,你的老师很不称职。请将这篇文章链接到他们和他们的校长。

【讨论】:

  • Turbo C++ 是still common in India in 2020。 More 和 more - “那是 40 年前过时的 Turbo C。印度大学仍然教它并拒绝教其他任何东西。他们给了我零分,因为我在考试,因为他们不知道 C++ 是标准化的,char * 已被弃用。”.
  • @PeterMortensen 是的...教授 C90 还可以(有趣的是,它仍然比 2020 年的 Visual Studio 更好),但它使用的 C++ 方言只是乱七八糟。
【解决方案3】:

Turbo C++ 是一个非常古老的编译器,它与 GNU C++ 编译器有点不同。您共享的代码将与 GNU 编译器完美配合,但要使用 Turbo C++ 运行它,您需要进行一些更改:

1.将头文件名称由iostream改为iostream.h
2。并删除“使用命名空间标准”这一行,这在 Turbo C++ 中是不需要的。 这是修改后的代码:

#include <iostream.h>

int main() 
{
  cout << "Hello, World!";
  return 0;
}

【讨论】:

  • 你的回答补充了什么,而接受的回答没有?
  • 给没有时间阅读长答案的人的要点。
  • 它不是“有点不同”,而是与 C++ 编译器大不相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
相关资源
最近更新 更多