it-swarm.asia

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

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

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

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

我错过的是什么?

179
Raúl Roa

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

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

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

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

CTRL-F5和子系统提示一起工作;它们不是单独的选择。

(由DJMorreTX提供 http://social.msdn.Microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6

377
Zoidberg

返回语句之前的标准方法是cin.get()

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

return行上放置一个断点。

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

23
Sam Harwell

另一种选择是使用

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

虽然这不是很便携,因为它只能在Windows上运行,但它会自动打印

按任意键继续...

18
Marcos Marin

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

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

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

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

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

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

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

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

编辑: /

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

7
JBentley

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

4
CMS

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

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

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

4
Juan Castano

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

3
Odys

只需在代码末尾添加系统(“pause”),然后返回0,就像这样

#include <stdlib.h>

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

main()的结束括号上放置一个断点。即使使用多个return语句,它也会被触发。唯一的缺点是不会捕获对exit()的调用。

如果您没有调试,请按照Zoidberg的回答中的建议开始您的程序 Ctrl+F5 而不仅仅是 F5

2
Chad

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

1
Amruth Pillai

我的2分:

选择1:在main()末尾添加断点

选择2:在return 0;之前添加此代码:

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

你需要包含<iomanip> for std::numeric_limits

1
Arnav Borborah

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

1
Denchik

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

1
Martin

另外一个选项:

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

主要:

int main(int argc, char* argv[]) {
    MAINRET;
}
0
chen_767
int main()
{
    //...
    getchar();
    return 0;
}
0
gonnavis

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

在Visual Studio中,打开 项目属性页 - > 调试

对于 Command ,输入$(ComSpec)

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

现在 F5 Ctrl-F5 执行 Windows/System32/cmd.exe 在新窗口中,和 /k 确保命令Prompt在执行完成后保持打开状态。

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

0
Jonathan Lidbeck

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

0
user9416431

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

atexit(system("pause"));

要么

atexit(cin.get());

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

0
Charaf Errachidi

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

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

0
Blechdose