std::cout 如何知道在哪里打印?

4
为什么我运行C++程序时会打开终端窗口,std::cout如何知道它要输出到该终端?

13
std::cout 将字符发送到标准输出流。操作系统会安排被发送到标准输出流的字符出现在终端上(或被重定向到文件、管道或其他地方);这部分内容不属于 C++ 语言的范畴。 - Igor Tandetnik
只有在您尝试从IDE内运行程序时,终端窗口才会打开。在这种情况下,如果您的程序不是本地GUI程序,IDE将通过调用命令行shell的实例来启动您的程序。该shell还提供了一个位置,让程序将控制台输出和错误消息定向(以及在需要时接受任何输入)。 - David C. Rankin
1
通常,启动代码的一部分(在main()之前执行)的工作是将诸如std::cout之类的东西与某些东西(监视器、窗口等)关联起来。这通常涉及操作系统的支持,操作系统可以访问程序运行的上下文(例如,它知道哪个命令行 shell 或窗口启动了程序,因此可以相应地链接输出和输入流)。 - Peter
@DavidC.Rankin "只有在从IDE内尝试运行程序时,终端窗口才会打开" - 这并不是真的。如果将程序编译为控制台应用程序,并且从现有终端窗口外部运行它,则操作系统将为其创建一个新的终端窗口。这与IDE无关。 - Remy Lebeau
@RemyLebeau - 是的,我应该澄清它是如何运行的。 - David C. Rankin
2个回答

5

每个操作系统都有一个称为“标准输出流”的东西,当您使用cout时,C++只是告诉操作系统将其打印到流中。操作系统会确定输出位置。


0

编译器会识别你正在编写控制台应用程序,并提供适合你所编写程序类型的运行时环境。

通常在启动新项目时选择应用程序类型,但在旧版编译器中,控制台类型是唯一可用的类型。MS-DOS和CP/M提供了终端服务,其中命令行解释器如“command.com”将是默认程序,可以调用其他程序如“myCppApp.exe”。

终端服务包括输入流(键盘输入)和输出流(屏幕显示)。这些被视为特殊文件,只读(cin)和只写(cout)。

C/C++通过cin/cout提供对这些标准磁盘操作系统服务的访问。

当Windows出现时,人们不再使用文本控制台(在某些计算机启动或BIOS设置中仍然可以看到),而是更喜欢使用模拟文本控制台的虚拟控制台窗口。

因此,这种情况是操作系统提供虚拟环境和编译器提供基于构建控制台应用程序的运行时代码的组合。


编译器既不知道也不关心你打算编写基于控制台的应用程序。std::cout输出到控制台,操作系统负责使其工作。如果你正在编写基于GUI的应用程序,你需要使用提供适当函数的库,同样,当你进行GUI调用时,操作系统负责使其工作。 - Pete Becker
链接器将为具有WinMain()的程序和具有main()的程序(在Linux和XWindows除外,其中XWindows在技术上是控制台应用程序)提供不同的运行时环境。 - Stephen Duffy
链接器会按照你的指示进行操作。如果你链接到与 GUI 兼容的代码,操作系统将负责提供支持代码。再次强调:知道你想要做什么的不是编译器,而是你的构建系统,因为你告诉它你想要什么。不要被 IDE 中的按钮设置所迷惑;那不是编译器。 - Pete Becker
你在这里纠结于细节。 - Stephen Duffy
我猜如果说编译器会根据 #define 等进行不同的操作,那么我也是错的,因为编译器甚至不知道有 #define 的存在。你在纠结于无关紧要的细节。这与程序为什么要打开一个终端窗口有什么关系呢?来杯 Horlicks 放松一下吧。 - Stephen Duffy

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