Вы говорите, что не хотите использовать хак system("pause")
. Почему нет?
Если это потому, что вы не хотите, чтобы программа запрашивала, когда она не отлаживается, есть способ обойти это. Это работает для меня:
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, но я думаю, что она была удалена.
ПРИМЕЧАНИЕ. Для реализации подпрограммы system () в Microsoft Visual Studio требуется переменная среды COMSPEC для идентификации интерпретатора командной строки. Если эта переменная окружения испорчена - например, если у вас есть проблема в свойствах отладки проекта Visual Studio, из-за которой переменные окружения не передаются должным образом при запуске программы - тогда она просто молча завершится ошибкой .