Что может объяснить std::cout ничего не отображать?

По какой-то причине 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;

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


person Benoît    schedule 13.04.2010    source источник
comment
Почему бы вам не поставить точку останова в этой строке и посмотреть, действительно ли выполняется этот фрагмент кода или нет...? это выполнено...?   -  person Mihir Mehta    schedule 13.04.2010
comment
У меня была похожая проблема, но это было потому, что я написал std::cout << "Number of SIFT Keypoints: " + siftImageKeypoints.size() << std::endl;. Решение было заменить + на ‹‹.   -  person Alexander Pacha    schedule 01.07.2013


Ответы (5)


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

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

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

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

YourApplication.exe > output.txt

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

YourApplication.exe | cat

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

person jamesdlin    schedule 13.04.2010
comment
Я не знал этого. Спасибо. - person clstrfsck; 13.04.2010
comment
чтобы получить stderr тоже: YourApplication.exe 2>&1 | cat - person JDiMatteo; 09.01.2015

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

Простое изменение SubSystem на Console в конфигурации проекта (/Configuration properties/Linker/System) заставляет все это работать. Графический интерфейс по-прежнему работает, но с фоновой консолью. Я могу справиться с этим.

person Benoît    schedule 13.04.2010
comment
В этом все еще что-то не так, потому что я могу легко увидеть cout, который я обычно не вижу, если использую оболочку cygwin для запуска программы. Вероятно, это связано с тем, что большинство программ WinAPI используют для вывода данных WriteConsole вместо cout и stdout. - person Euri Pinhollow; 08.11.2017

Пытаться

КОНФИГ += консоль

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

person ktk    schedule 13.04.2010
comment
Не забудьте отметить как ответ, если вы удовлетворены этим ответом и думаете, что он решает вашу проблему (что вы, очевидно, делаете). - person rbaleksandar; 08.07.2014

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

person Michael Aaron Safyan    schedule 13.04.2010
comment
@Benoit, не имеет значения, где вы его запускаете ... это полностью зависит от самого приложения (использует ли оно WinMain или другие функции, связанные с графическим интерфейсом Windows). - person Michael Aaron Safyan; 13.04.2010
comment
Необходимо создать не только консоль, но и стандартные файловые дескрипторы для входа, выхода и ошибки, которые необходимо открыть. - person sbk; 13.04.2010
comment
@MichaelAaronSafyan ИМЕЕТ значение, откуда вы его запускаете. Я легко вижу cout, который я обычно не вижу, если использую оболочку cygwin для запуска программы, но я не вижу его из CMD. - person Euri Pinhollow; 08.11.2017

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

person manuel    schedule 13.04.2010