Чем можно объяснить, что std :: cout ничего не отображает? - PullRequest
15 голосов
/ 13 апреля 2010

По какой-то причине std :: cout ничего не отображает с моим приложением. Ниже приводится описание моей среды разработки.

Я работаю над приложением Qt, использующим Qt Creator. Поскольку Qt Creator не может быть запущен с моей станции (XP64), в настоящее время я разрабатываю его с помощью Visual Studio 2008 и плагина Qt (путем импорта файла проекта .pro). Все вроде нормально и приложение работает.

В некоторых случаях (в зависимости от аргументов командной строки) я не хочу запускать HIM, просто отображаю несколько предложений в CLI (например, требуются аргументы командной строки).

Я не получаю никакой ошибки, но ничего не отображается. Соответствующий код, который, я уверен, выполняется, является (классическим) следующим:

std::cout << "is this going to be displayed ?" << std::endl;

У вас есть идеи, почему ничего не отображается?

Ответы [ 5 ]

17 голосов
/ 13 апреля 2010

В Windows программы обычно создаются как SUBSYSTEM: приложение WINDOWS или как SUBSYSTEM: CONSOLE .

Программы, созданные с помощью SUBSYSTEM: CONSOLE, должны быть приложениями в текстовом режиме. Для этого типа приложений stdout и stderr выводят на консоль, с которой вы их запустили, создавая новую консоль при необходимости.

Напротив, приложения SUBSYSTEM: WINDOWS не работают с консолью. Вы все еще можете писать в stdout и stderr, но они обычно никуда не уходят. Вы можете использовать AllocConsole для создания консоли для печати, но это всегда будет печатать во вновь созданное окно консоли, а не в окно консоли, из которой вы запустили программу.

Один прием для SUBSYSTEM: приложений WINDOWS заключается в том, что даже при отсутствии консоли вы все равно можете pipe stdout и stderr. Для передачи в стандартный поток вы можете сделать:

YourApplication.exe > output.txt

или если у вас есть cat (или эквивалент):

YourApplication.exe | cat

Также обратите внимание, что на самом деле нет никакой разницы между приложениями SUBSYSTEM: WINDOWS и SUBSYSTEM: CONSOLE, кроме того, как Windows обрабатывает их при создании процесса. (Вы можете создавать окна в приложениях SUBSYSTEM: CONSOLE.) Поэтому вы можете легко переключаться между типами SUBSYSTEM (например, для использования SUBSYSTEM: CONSOLE для отладочных сборок и SUBSYSTEM: WINDOWS для выпусков).

17 голосов
/ 13 апреля 2010

Хорошо, ответ найден. Простой ответ, конечно, как всегда, когда сталкиваешься с такими проблемами. Майкл Аарон был на правильном пути.

Простое изменение SubSystem на Console в конфигурации проекта (/ Свойства конфигурации / Linker / System) заставляет все это работать. GUI все еще работает, но с фоновой консолью. Я могу справиться с этим.

8 голосов
/ 14 апреля 2010

Попробуйте

CONFIG + = консоль

в вашем .pro файле.

4 голосов
/ 13 апреля 2010

Windows различает консольные приложения и приложения с графическим интерфейсом и по умолчанию не создает консоль для приложений с графическим интерфейсом ( см. Эту страницу из MSDN ). Вы можете использовать AllocConsole для его создания.

0 голосов
/ 13 апреля 2010

Возможно, это не строка std :: cout, которая делает его не отображаемым, а функция, содержащая его.Возможно, он вообще не вызывается, и поэтому std :: cout не работает.

...