суббота, 2 апреля 2016 г.

Правильная работа с консольными приложениями в Visual Studio



Как добиться паузы перед завершением программы

При запуске консольного проекта из Visual Studio в конце работы программы окно может автоматически закрыться. Так быстро, что юный программист даже не успеет увидеть результат работы свой программы. Для борьбы с этим практикуют разные способы. Как ни странно, у новичков и у профессионалов разные подходы.
  • Самый отвратительный способ - вставка кода "system("pause")" перед завершением программы. Так юный программист не только модифицирует код, но и вставляет жуткий костыль, который при других способах запуска или на другой ОС работать не будет.
  • Правильный, но неудобный способ: воткнуть точку останова (breakpoint) отладчика перед завершением.
  • Тоже правильный, и при этом удобный способ: запускать программу без отладчика (хоткей "Ctrl+F5" вместо "F5")

"Почему Ctrl+F5" не работает?

Иногда запуск без отладки не работает, как надо: консоль не выводит надпись "Press any key to continue..." и просто закрывается без ожидания.
Скорее всего, вы создавали проект через шаблон "Empty Project". В ОС Windows каждое приложение привязано к одной из подсистем. Это могут быть:
  •  MS-DOS совместимая подсистема CONSOLE
  • Обычная подсистема WINDOWS для графических приложений.
  • Специальные подсистемы для драйверов, для POSIX-приложений и других задач.
Шаблон Empty Project создаёт приложения для подсистемы WINDOWS, а не подсистемы CONSOLE. Эта подсистема не подразумевает создания окна консоли при запуске, потому что графическим приложениям оно ни к чему. При запуске программы из VS через Ctrl+F5 консоль всё же появляется, но закрывается без обычного "Press any key to continue...".

Чтобы исправить подсистему, зайдите в настройки проекта, на вкладку Linker, в раздел System и смените значение свойства "SubSystem" на "Console". Если у вас русскоязычная Visual Studio, я Вам искренне сочувствую.

Прочее

Остальные советы будут менее подробными, так как я не могу описать все технические детали в рамках одного поста.
  • Стремитесь использовать в консольных приложениях автоматические тесты вместо ручного тестирования. Тесты могут быть реализованы как модульные тесты (например, с библиотекой Boost.Test) или как автоматический запуск собранной программы и проверка её вывода с ожидаемым (такие тесты можно сделать на основе bat-файлов, shell-скриптов или скриптов на Python).

Комментариев нет:

Отправить комментарий