为什么一个类似于“Hello World”的简单程序在Turbo C++中无法编译?

110

我开始学习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'

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


42
这是为了针对询问Turbo C++问题的标准重定向,许多这些问题通常很快被评论中简短的解释拒绝,而它们实际上需要一个适当的答案。欢迎改进。 - n. m.
8
建议说明您正在使用的 Turbo C++ 版本。2006 版本可以处理这个程序。 - M.M
6
我已经开始学习C++来参加编程课程。这是一个谎言。句号。 - bugwheels94
5
请查看此链接:https://zh.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E4%BA%BA%E7%A7%B0_%28%E6%95%85%E4%BA%8B%29。 - n. m.
6
我不知道bugwheells是否是这个意思,但我认为他们的意思是,如果一个人学的是特定的老版本TurboC++(无法编译此代码),那么他们并没有学到标准C++(很多人,包括我在内,默认理解为标准C++)。 - eerorika
显示剩余2条评论
3个回答

170
除了一些风格问题(不推荐使用“using namespace std”),这个程序没有问题。问题出在Turbo C++上,它是一款非常老旧的软件。它实现了一个称为“前ANSI C++” 的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++要容易得多。
2. 关于Turbo C++几乎没有现成的文献资料。您在互联网上或书籍中找到的几乎100%的C++资料都不能直接适用于Turbo C++。有些只需要进行轻微的改编,而其他材料则完全无法使用。对于您立即可用的帮助来源,几乎唯一的选择是内置的Turbo C++帮助。
3. 很少有人记得Turbo C++。在论坛上提问时,请始终指定您正在使用的是ANSI之前的方言,以便过滤掉针对该语言现代版本的响应。您可能会在每个问题中都得到一堆建议立即停止并切换到现代编译器的评论。

现在有很多现代化的免费编译器和集成开发环境(像啤酒一样自由,也像言论一样自由),可以代替Turbo C++。其中一些包括:

  1. Visual C++ Community Edition 是来自微软的集成开发环境和编译器
  2. Code::Blocks 是一款轻量级的集成开发环境。在 Windows 上,它附带了一个有点过时的编译器,但是你可以自己安装一个更现代化的编译器。
  3. Eclipse CDT 是一款功能强大的跨平台集成开发环境。它不带有自己的编译器,所以你需要安装一个单独的编译器。在 Windows 上,可以使用 MinGW
  4. 还有很多其他选择
  5. 此外,还有许多在线编译器,如 http://ideone.comhttps://www.onlinegdb.com/http://coliru.stacked-crooked.com/,以及更多选择(这些主要适用于尝试想法和编写非常小的程序)。
  6. Clang/LLVMGCC 都是支持最新版本的 C++ 的免费软件编译器。

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


7
我认为它更多的意思是“根据当前标准,该程序没有问题。”它是否具有良好的编程风格是另一回事。 - Hatted Rooster
22
@Rakete1111,合理使用 using namespace std 是没有问题的。将其教授给新程序员可能是一个好的教学决策,但本质上并没有道德上的错误。 - n. m.
10
我同意"using namespace std"不是好的编程习惯,但我认为它应该出现在这个问题中,因为你在网上找到的C++ hello world程序几乎总是使用它。所以重要的是要明确这不是导致Turbo C++出现问题的原因。也许可以改成“这个程序是合法的,根据当前的C++标准,它应该可以编译通过”,而不是说“这个程序没有问题”。 - zwol
6
同样的道理,所有对标准函数的调用都是不可靠的,因为你不知道会添加什么新的重载。你也不知道从下一个标准中哪些语言特性将消失或改变含义。并非所有程序都需要存活几十年或可移植到任意编译器。 - n. m.
7
"很少有人记得Turbo C++"。我不同意。至少有一个整个大国今天仍在积极地教授它。" - Lightness Races in Orbit
显示剩余15条评论

14

"Turbo C++" 可以指代许多编译器。在询问此问题时,包含版本号是很重要的。

  • Borland Turbo C++ 在 3.1 版本之前是经典蓝色背景 IDE 下的纯 MS DOS 编译器。它们大约发布于 1989 年到 1992 年之间,早在 C++ 成为标准之前,而这个标准是在 1998 年制定的。因此,它们使用的是一种预先标准化的 C++ 方言。

    最值得注意的是,它们使用的是 #include <iostream.h> 语法,而不是标准的 #include <iostream>,但也没有涵盖很多 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。大约在那个时候,他们发布了一个名为“Turbo C++”的免费版本的Borland Builder。此版本完全符合C++03标准。

  • 现在这些编译器被称为Embarcadero C++ Builder。我相信它们目前支持C++11和一些C++14。 更多信息请参考此处。

  • 毋庸置疑,作为学生,您不应该使用除了现代编译器以外的任何东西。在2018年学习C++时使用1991年的MS DOS编译器是疯狂的行为。这不仅是逆生产的,而且直接有害,会使您成为一个糟糕的C++程序员。如果您的学校强制您使用Turbo C++ 3.1或更早版本,则您的学校很糟糕,您的老师极度无能。请向他们和他们的校长链接此帖子。


    2
    Turbo C++在2020年仍然在印度很常见。更多的信息和评论可以在这里找到:“那是40年过时的Turbo C。印度的大学仍然教授它,并拒绝教授其他任何东西。他们给了我零分,因为我在考试中使用了std::string而不是char *,因为他们不知道C++已经标准化,而char *已经被弃用。” - Peter Mortensen
    @PeterMortensen 是的...它对于教授C90来说还算可以(有趣的是,它在这方面仍然比2020年的Visual Studio更好),但它使用的C++方言实在是乱七八糟。 - Lundin

    6

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

    1. 将头文件名称从iostream更改为iostream.h
    2. 删除“using namespace std”这一行。在Turbo C++中不需要它。 以下是修改后的代码:

    #include <iostream.h>
    
    int main() 
    {
      cout << "Hello, World!";
      return 0;
    }
    

    7
    你的回答有何不同于被接受的回答? - Rakete1111
    9
    我会尽力以通俗易懂的方式进行翻译,但不会改变原意。以下是需要翻译的内容:“gist for the people who don't have time to read long answers.” - Yougansh Thakur
    它与C++编译器有着非常大的不同,而不仅仅是一点点不同。 - phuclv

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