2

我刚开始学习 c++,在阅读http://www.dev-hq.net/c++/1--the-basics中的 c++ 教程时,我发现在某些文本编辑器中编写 c++ 程序与在视觉中编写程序不同c++。它说类似“Visual C++ 在大多数情况下需要在'main'函数结束之前暂停某种应用程序,因为它会生成一个在执行后会消失的窗口”。这是什么意思?

4

4 回答 4

5

简短的回答:这不是强制性的。该站点建议在程序退出之前可以看到控制台窗口中的输出(从而关闭窗口)。

长答案:如果您使用IDE开发没有 GUI 的 C++ 或 C 程序,则 IDE 通过启动控制台/终端窗口(也称为命令提示符)显示输出。当您的程序启动并在程序结束时立即关闭时,将显示此窗口。说如果你只是打印“你好,世界!” 并且不要暂停,终端窗口会打开,显示Hello, world! 并立即关闭,一切都在眨眼之间。所以习惯上在最后插入一个停顿。并非所有 IDE 都出现此问题。有些在其自己的集成窗口中显示输出,有些通过脚本插入暂停行为等。

应该理解,这只是使窗口停留的一种技巧,从程序的角度来看,这样做的阻塞调用是没有用的。也不要使用system("pause");它,因为它有问题,除了它不可移植并且只能在 Windows 平台上运行。

#include <iostream>
#include <limits>

int main()
{
    std::cout << "Press ENTER(s) to exit...";
    // flush data in cin's buffer
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    // blocking call to fresh input from user
    std::cin.get();
}
  • 这将是一种可移植的方式,即无论您使用的平台如何,它都可以工作。

  • 另一种方法是使用ISO C 标准规定的可移植getchar的(不是类似的名称),但它有其怪癖getch

  • 另一种方法是按照 Raja 的建议设置断点。它还将让您在学习调试器时沾沾自喜,调试器是编程中必不可少的工具。

  • 为了完全避免这个问题,您可以从控制台窗口自己运行程序。虽然有时对于初学者来说可能会有点乏味,但手动编译代码并在没有 IDE 的情况下自己运行它会给你更多的洞察力,并且是一种很好的学习体验。

我仍然建议手动编译或调试断点方法,而不是在程序中注入虚假的暂停/阻塞调用;请注意,从用户那里收到的输入只是被忽略了,并且从未在程序中进一步使用,因此从程序的角度来看是多余的,因此建议不要使用它。

于 2013-10-18T06:13:49.097 回答
1

当您使用“运行项目”(经典的 Visual-C++ 键绑定中的 Ctrl+F5,而不仅仅是 F5,即“调试项目”)时,Visual Studio 将保持您的控制台窗口打开,直到您按下按钮。

只有当您使用“调试项目”时它才不会。这是有道理的,因为您通常只想在实际寻找问题时使用该选项(启动和关闭时间更长并且运行速度更慢),在这种情况下,您可能在程序中设置了断点并且可以简单地在 的最后一行设置一个main()

因此,所有建议的解决方法以及对 Visual Studio 的抨击都是不必要和错误的。

于 2013-10-18T13:34:00.530 回答
-1

这只是意味着可执行窗口将在执行完成后立即关闭。

我建议在您之前使用getchar();标准库(<iostream><stdio.h>标头)中的简单语句return 0;。这意味着您必须按一个键才能关闭窗口。正如您提到的 Visual C++,system("pause");在 Windows 系统返回之​​前也可以正常工作。

当然,如果您较早地从 main 返回(常见于错误代码、未处理的异常或某处的退出调用),您可能无法使用该暂停机制。当你刚刚开始时,你现在不太可能遇到这些东西。

从命令行运行程序也可以查看输出。

于 2013-10-18T06:23:29.157 回答
-1

这是我用来暂停控制台应用程序并让我查看结果的东西:

void waitForUser()
{
    // if for some reason cin is in invalid state
    // we need to clear it
    std::cin.clear(); 

    // if we used cin to input something it is likely to
    // contain trailing \n symbols , we need to get rid of them
    std::cin.ignore( std::cin.rdbuf()->in_avail() );

    // we wait for a user to hit Enter here                     
    std::cin.get();
}

只需在末尾调用此函数即可main

于 2013-10-18T06:41:45.753 回答