【问题标题】:Does visual c++ require application pausing before the end of the 'main' functionVisual C++ 是否需要在“主”函数结束之前暂停应用程序
【发布时间】:2023-03-04 22:20:01
【问题描述】:

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

【问题讨论】:

  • 如果你正在调试,你可以在 main 结束之前设置一个断点来查看控制台窗口(这是你的标准输出和错误消息默认进入的地方)
  • 哇,这个“问题”一直存在于 VS 中......永远,而不是 MS 添加一个选项来保持控制台窗口打开,人们仍在寻找新的解决方法......跨度>
  • @rubenvb VC++ 至少从第 6 版(即 16 )开始就一直保持控制台打开状态!你只需要使用“运行项目”而不是“调试项目”来启动。
  • @Sebastian 你有我的支持。我错了。

标签: c++ main


【解决方案1】:

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

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

应该理解,这只是使窗口停留的一种技巧,并且从程序的角度来看,这样做的阻塞调用是没有用的。还有don't use 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();
}
  • 这将是一种可移植的方式,即无论您使用什么平台,它都可以工作。

  • 另一种方法是使用 getchar(不是类似名称的 getch),它是 ISO C 标准要求的可移植的,但 it has its quirks

  • 另一种方法是按照 Raja 的建议设置断点。调试器是编程中必不可少的工具。

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

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

【讨论】:

  • 我该怎么做?我只是一个菜鸟..当我运行一个简单的 hello world win 控制台时,窗口在我阅读之前就关闭了。
  • 谢谢,现在我明白他们的意思了。
  • 请不要泛化到任何 IDE,问题是特定于 Windows 上的(即使在那里也有可能破解它,但我认为没有人这样做)。在其他平台上,输出更容易捕获,因此那里的 IDE 会在某些“输出”选项卡或嵌入式“控制台”选项卡中显示输出。在 Windows 上它没有完成,因为它需要丑陋的 hack 才能完全完成。
  • @JanHudec:现在修复了更多细节。谢谢!
  • @legends2k 查看我自己的答案。这里的所有答案都假定问题中的断言(“Visual C++ 不会让你的控制台窗口保持打开”)是正确的,而实际上不是。您的回答提供了很多解决方法,但它没有指出特定问题首先不存在。这意味着提出问题的人以及所有其他将来阅读此线程的人都会无缘无故地将这些 sn-ps 添加到他们的代码中。
【解决方案2】:

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

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

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

【讨论】:

  • 它们不是不必要的,具体取决于您要完成的工作。 Visual Studio 在您运行项目时保持控制台窗口打开很好,但是当您分发执行某些计算的二进制文件并且不希望控制台在您运行时自动关闭时呢?
  • @Sean 在某些情况下,您可能希望控制台窗口保持打开状态。但问题是关于 Visual C++ 本身不能做到这一点的断言,而不是任何其他用例。
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

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

    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末尾调用这个函数

    【讨论】:

    • 对于像我这样的菜鸟来说,这看起来很混乱。
    • 是的,但它似乎一直有效(例如,不像 getchar()),而且它不依赖于平台。
    • 如何在一个简单的“hello world”控制台应用中做到这一点?
    • 在一个简单的“hello world”控制台应用程序中getchar();std::cin.get() 就可以了。
    • 谢谢,我现在要在 Visual c++ 中尝试这个,用一个简单的 hello world。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多