如何在Visual C ++中保持控制台窗口打开?

时间:2009-01-18 05:00:23

标签: visual-c++ console

我开始使用Visual C ++,我想知道如何保留控制台窗口。

例如,这将是典型的“hello world”应用程序:

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    return 0;
}

我错过的是什么?

22 个答案:

答案 0 :(得分:377)

使用 Ctrl + F5 而不是 F5 启动项目。

程序退出后,控制台窗口将保持打开并显示Press any key to continue . . .消息。

请注意,这需要Console (/SUBSYSTEM:CONSOLE)链接器选项,您可以按如下方式启用它:

  1. 打开项目,然后转到解决方案资源管理器。如果您在K&amp; R中跟随我,您的“解决方案”将是“hello”,其中包含1个项目,也是“hello”的粗体。
  2. 右键单击'hello'(或任何项目名称。)
  3. 从上下文菜单中选择“属性”。
  4. 选择配置属性&gt;链接器&gt;系统。
  5. 对于右侧窗格中的“子系统”属性,请单击右侧列中的下拉框。
  6. 选择“控制台(/ SUBSYSTEM:CONSOLE)”
  7. 单击“应用”,等待它完成任何操作,然后单击“确定”。 (如果“Apply”显示为灰色,请选择其他子系统选项,单击Apply,然后返回并应用控制台选项。我的经验是OK本身不起作用。)
  8. CTRL-F5和子系统提示一起工作;它们不是单独的选择。

    (来自http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6的DJMorreTX提供)

答案 1 :(得分:40)

在您的退货声明之前,标准方式是cin.get()

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    cin.get();
    return 0;
}

答案 2 :(得分:24)

return行放置一个断点。

你在调试器中运行它,对吗?

答案 3 :(得分:17)

另一种选择是使用

#include <process.h>
system("pause");

虽然这不是很便携,因为它只适用于Windows,但会自动打印

  

按任意键继续......

答案 4 :(得分:7)

对于makefile项目,由于Visual Studio中的错误(至少在2012版本之前存在 - 我还没有测试过2013年),接受的解决方案失败了。此错误详细here

为了让程序在makefile项目终止后暂停控制台,请执行以下步骤(对于2010 - 2012以外的版本,这可能会有所不同):

1)将/SUBSYSTEM:CONSOLE传递给链接器。 - 编辑:见下文。

2)在文本编辑器中打开项目文件(.vcxproj)。

3)在根<project>标记内插入以下内容:

<ItemDefinitionGroup>
  <Link>
    <SubSystem>Console</SubSystem>
  </Link>
</ItemDefinitionGroup>

4)在解决方案中重新加载项目。

5)运行程序而不调试(CTRL + F5)。

修改

根据我在下面的评论,设置链接器选项/SUBSYSTEM:CONSOLE实际上与makefile项目无关(如果您使用的是MSVC以外的编译器,则不一定可能)。重要的是该设置被添加到.vcxproj文件中,如上面的步骤3所示。

答案 5 :(得分:4)

您可以在return语句之前使用cin.get();cin.ignore();,以避免关闭控制台窗口。

答案 6 :(得分:4)

在main的最后一个花括号上放一个断点。

    int main () {
       //...your code...
       return 0;
    } //<- breakpoint here

它适用于我,无需在没有调试的情况下运行。它还会在命中断点之前执行析构函数,这样您就可以检查在这些析构函数上打印的任何消息(如果有的话)。

答案 7 :(得分:3)

只需在您的_tmain方法的结束括号中添加一个断点即可。这是更简单的方法,而且您无需添加代码即可进行调试。

答案 8 :(得分:2)

main()的结尾括号上放置一个断点。即使有多个return语句,它也会被绊倒。唯一的缺点是不会发现对exit()的调用。

如果您没有调试,请按照Zoidberg的回答中的建议,使用 Ctrl + F5 而不是 F5 启动您的程序。

答案 9 :(得分:2)

只需在代码末尾添加系统(&#34;暂停&#34;),然后像这样返回0

#include <stdlib.h>

int main()
{
    //some code goes here
    system("pause")
    return 0;
}

答案 10 :(得分:1)

我包含#include <conio.h>,然后在getch();行之前添加return 0;。这就是我在学校学到的东西。上面提到的方法与我看到的完全不同。

答案 11 :(得分:1)

有同样的问题。我在return语句之前使用_getch()。它有效。

答案 12 :(得分:1)

cin.get()system("PAUSE")。 我没有听说你可以使用return(0);

答案 13 :(得分:1)

我的2分:

选择1:在return 0;

的末尾添加断点

选择2:在std::cout << "Press ENTER to continue..."; //So the User knows what to do std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

之前添加此代码
<iomanip>

您需要为std::numeric_limits

添加{{1}}

答案 14 :(得分:1)

正如某些人已经指出的那样,Zoidbergs解决方案不附带调试器,这通常是您不想要的。

最好的imo选项是通过转到“工具”>“选项”>“调试”>“常规”,相应地配置VS(从VS 2017起)。在那里,您取消选中“调试停止时自动关闭控制台”(在最底部),您可能会选中该选项。

答案 15 :(得分:0)

(某些选项可能会被不同的名称调用。我不使用英文版本)

我遇到了同样的问题,当我用“空项目”选项创建项目时,创建项目为“Win32-console application”而不是“空项目”。在现在弹出的对话框中,按“继续”,之后可以选中“空项目”选项并按确认。之后,CTRL + F5将打开一个不会自动关闭的控制台。

答案 16 :(得分:0)

我有同样的问题;在我的应用程序中有多个exit()点,并且没有办法知道它出在哪里,然后我发现了这个:

atexit(system("pause"));

atexit(cin.get());

这样,无论我们在程序中退出,它都会停止。

答案 17 :(得分:0)

另一种选择:

#ifdef _WIN32
#define MAINRET system("pause");return 0
#else
#define MAINRET return 0
#endif

主要:

int main(int argc, char* argv[]) {
    MAINRET;
}

答案 18 :(得分:0)

实际上,真正的解决方案是选择项目模板本身。 您必须在较旧的VS中选择Win32控制台应用程序,或先填写项目名称,然后双击Windows桌面向导,然后选择Win32控制台应用程序。然后在此处选择空项目。然后,这允许原始提问者真正想要的,而无需添加额外的停止点和保持代码。 我也遇到了这个问题。答案也在MSDN网站上。

答案 19 :(得分:0)

这是一种保持命令窗口打开的方法,无论执行如何停止而不修改任何代码:

在Visual Studio中,打开项目属性页 - &gt;的调试

对于命令,请输入$(ComSpec)

对于命令参数,请输入/k $(TargetPath)。将任何参数附加到您自己的应用程序。

现在 F5 Ctrl-F5 在新窗口中执行 Windows / System32 / cmd.exe / k < / strong>确保在执行完成后命令提示符保持打开状态。

缺点是执行不会在断点处停止。

答案 20 :(得分:0)

int main()
{
    //...
    getchar();
    return 0;
}

答案 21 :(得分:-1)

你可以放 keep_window_open(); 在返回之前是一个例子

int main()
{
    cout<<"hello world!\n";
    keep_window_open ();
    return 0;
}