【问题标题】:C++ - Command prompt window in Visual Studio [duplicate]C++ - Visual Studio 中的命令提示符窗口 [重复]
【发布时间】:2011-05-11 17:33:19
【问题描述】:

可能重复:
How to stop C++ console application from exiting immediately?

我刚开始在学习 C++ 时使用 Visual Studio 2010。当我编译并运行我的代码时,我会短暂地看到命令提示符出现在屏幕上,然后消失,并在调试器中看到以下内容,无论我在.cpp 文件中写了什么。

'c++ lessons.exe': Loaded 'C:\Users\User\Documents\Visual Studio 2010\Projects\c++ lessons\Debug\c++ lessons.exe', Symbols loaded.
'c++ lessons.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file
'c++ lessons.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file
'c++ lessons.exe': Loaded 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file
'c++ lessons.exe': Loaded 'C:\Windows\SysWOW64\msvcp100d.dll', Symbols loaded.
'c++ lessons.exe': Loaded 'C:\Windows\SysWOW64\msvcr100d.dll', Symbols loaded.
The program '[5904] c++ lessons.exe: Native' has exited with code 0 (0x0).

我进行了一些搜索,试图为自己找到解决方案。但是,大多数建议都涉及添加暂停或等待输入等技巧,我尝试过 Ctrl + F5。有没有办法可以在 Visual Studio 中设置构建和运行过程以显示命令提示符?

【问题讨论】:

标签: c++


【解决方案1】:

main() 的右大括号处设置断点。

【讨论】:

    【解决方案2】:

    转到Project->Properties->Configuration Properties->Debugging

    在命令字段中,输入:“cmd.exe

    在命令参数字段中,输入:“\k $(TargetPath)

    【讨论】:

      【解决方案3】:

      您可以将命令添加到“工具”菜单,并将其输出重定向到输出窗口上的选项卡。您可以使用特定于项目的宏作为命令的一部分,因此也许您可以通过一些摆弄来创建一个运行您的程序的工具(cmd /c "$(OutputPath)" 可能会这样做,我想?--我没有方便的 VS)并将其输出打印到输出窗口。但是,这不允许您在调试器下运行它。

      我发现的最佳解决方案就是把它吸干。与 Visual Studio 抗争是白费力气,因为 Visual Studio 总是胜出。但你可以让自己的生活更轻松。添加如下函数:

      void pause() {
          if(IsDebuggerPresent()) {
              printf("press enter.\n");
              getchar();
          }
      }
      

      然后在启动时将其注册为 atexit 函数(因为您希望在调用 exit 而不是从 main 返回时调用它):

      atexit(&pause);
      

      然后,当您第一次运行程序时,它正在等待“按回车”提示符,转到控制台的属性并设置 9,999 行向后滚动。 (我还推荐快速编辑模式和较小的字体,但这取决于您。)然后当您单击“应用”时,选择“保存这些选项以供将来使用相同标题的控制台窗口使用”。

      这样,在随后的运行中,您将拥有一个不错的大滚动缓冲区,相当简单的复制和粘贴,并且如果您的程序运行成功完成,命令提示符不会立即消失。

      是的,我知道这是您不想要的暂停解决方案! -- 但我从来没有发现更好的东西,而且,就它而言,它工作正常。

      您可以与上述方法结合使用的另一种方法是具有类似以下功能的东西,并尽可能使用它来代替printf

      void xprintf(const char *fmt, ...) {
          char buf[16384];//16K - tweak to taste
          va_list v;
          va_start(v, fmt);
          if(IsDebuggerPresent()) {
              _vsnprintf(buf, sizeof buf, fmt, v);
              buf[sizeof buf - 1] = 0;//_vsnprintf is odd
              OutputDebugString(buf);
              fputs(stdout, buf);
          } else {
              vprintf(fmt,v);
          }
          va_end(v);
       }
      

      现在您的程序打印的任何内容都将转到输出窗口,并且(直到您厌倦了输出窗口传说中的树懒,并删除OutputDebugString 调用,或者更有选择性地调用xprintf...)您将即使在程序运行结束后也能看到程序的输出。

      (就我个人而言,我将所有这些一起使用。我不明白为什么VS的输出窗口这么慢,我不明白为什么它不捕获stdout/stderr,但是因为我已经决定使用以上,我觉得不那么麻烦了。结果不是很好,但可以忍受,你可以习惯它。)

      【讨论】:

      • 我认为这不是线程安全的。
      • 你是对的,不,不是! (抱歉;我的命令行程序几乎总是单线程的。)我已经删除了static - 我认为这应该可以解决问题。我相信OutputDebugString 是线程安全的 - 不记得注意到从多个线程使用它的任何问题,尽管我没有经常这样做 - 但如果结果不是这样,你可以使用互斥锁或其他东西来解决它就是这样。
      猜你喜欢
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 2015-10-27
      • 2010-11-10
      • 1970-01-01
      • 2015-09-29
      • 2018-06-18
      相关资源
      最近更新 更多