你说你不想使用system("pause")
的hack。为什么不想用?
如果是因为你不想在非调试状态下显示提示框,那么有一种解决方法。这对我有效:
void pause () {
system ("pause");
}
int main (int argc, char ** argv) {
// If "launched", then don t let the console close at the end until
// the user has seen the report.
// (See the MSDN ConGUI sample code)
//
do {
HANDLE hConsoleOutput = ::GetStdHandle (STD_OUTPUT_HANDLE);
if (INVALID_HANDLE_VALUE == hConsoleOutput)
break;
CONSOLE_SCREEN_BUFFER_INFO csbi;
if (0 == ::GetConsoleScreenBufferInfo (hConsoleOutput, &csbi))
break;
if (0 != csbi.dwCursorPosition.X)
break;
if (0 != csbi.dwCursorPosition.Y)
break;
if (csbi.dwSize.X <= 0)
break;
if (csbi.dwSize.Y <= 0)
break;
atexit (pause);
} while (0);
我只需将此代码粘贴到我编写的每个新控制台应用程序中。如果程序正在从命令窗口运行,则光标位置不会是<0,0>,并且不会调用atexit()
。如果它是从您的调试器(任何调试器)启动的,则控制台光标位置将是<0,0>,并且将执行atexit()
调用。
我从以前在MSDN库中的一个示例程序中获得了这个想法,但我认为它已经被删除了。
注:Microsoft Visual Studio 实现的 system() 函数需要 COMSPEC 环境变量来识别命令行解释器。如果这个环境变量被搞乱了 - 例如,如果在 Visual Studio 项目的调试属性中存在问题,导致环境变量在程序启动时没有正确传递,则它将默默失败。