У меня есть проект win32, который я загрузил в Visual Studio 2005. Я хотел бы иметь возможность печатать что-либо в окне вывода Visual Studio, но я не могу понять, как это сделать. Я пытался «Printf» и «<<» COUT но мои сообщения остаются упорно без надписей.
Есть ли какой-то особый способ печати в окне вывода Visual Studio?
Ответы:
Вы можете использовать
OutputDebugString
.OutputDebugString
- это макрос, который в зависимости от ваших параметров сборки сопоставляется сOutputDebugStringA(char const*)
илиOutputDebugStringW(wchar_t const*)
. В последнем случае вам нужно будет передать функции строку широких символов. Чтобы создать литерал с широким символом, вы можете использоватьL
префикс:Обычно вы будете использовать версию макроса вместе с таким
_T
макросом:Если ваш проект настроен на сборку для UNICODE, он расширится до:
Если вы не строите для UNICODE, он расширится до:
источник
myStr
. Является ли этоchar*
,wchar_t*
илиLPTSTR
? Предполагая, что этоchar*
вы просто звонитеOutputDebugStringA(myStr)
или используетеOutputDebugStringW
withwchar_t*
иOutputDebugString
with,LPTSTR
как описано в моем ответе.OutputDebugString
и либо определите соответствующие символы препроцессора, соответствующие ширине символов, которые вы используете, либо используйте гибкие типы «T», которые позволяют компилировать как 8-, так и 16-битные символы.Если проект представляет собой проект с графическим интерфейсом, консоль не появится. Для того, чтобы превратить проект в консольный, вам нужно зайти в панель свойств проекта и установить:
Это решение работает, только если у вас есть классическая точка входа « int main () ».
Но если вы похожи на мой случай (проект openGL), вам не нужно редактировать свойства, так как это работает лучше:
printf и cout будут работать как обычно.
Если вы вызовете AllocConsole перед созданием окна, консоль появится за окном, если вы вызовете ее после, она появится впереди.
Обновить
freopen
устарела и может быть небезопасной.freopen_s
Вместо этого используйте :источник
EDITBIN
можно установить подсистему,CONSOLE
даже если вы используетеWinMain
вместоint main()
.Чтобы печатать в
real
консоли, вам нужно сделать его видимым с помощью флага компоновщика/SUBSYSTEM:CONSOLE
. Дополнительное окно консоли раздражает, но для целей отладки очень ценно.OutputDebugString
выводит на вывод отладчика при работе внутри отладчика.источник
Рассмотрите возможность использования макросов времени выполнения VC ++ для создания отчетов _RPT N () и _RPTF N ()
Пример...
Или вы можете напрямую использовать функции времени выполнения VC ++ _CrtDbgReport, _CrtDbgReportW .
источник
_RPTF0
можно использовать там, где не ожидается, что переменные будут переданы после строки формата._RPTFN
Макро, с другой стороны, требует , по меньшей мере , один аргумента следующей строки формата.Если вы хотите распечатать десятичные переменные:
источник
%u
для беззнакового,%f
для плавающего по ссылке .Если вам нужен вывод существующей программы, которая широко использовала printf без изменения кода (или с минимальными изменениями), вы можете переопределить printf следующим образом и добавить его в общий заголовок (stdafx.h).
источник
Ваш проект Win32, скорее всего, представляет собой проект графического интерфейса, а не консольный проект. Это вызывает разницу в исполняемом заголовке. В результате ваш проект графического интерфейса будет отвечать за открытие собственного окна. Хотя это может быть консольное окно. Вызовите
AllocConsole()
его, чтобы создать его, и используйте функции консоли Win32 для записи в него.источник
Я сам искал способ сделать это и нашел простое решение.
Я предполагаю, что вы запустили проект Win32 по умолчанию (приложение Windows) в Visual Studio, который предоставляет функцию «WinMain». По умолчанию Visual Studio устанавливает точку входа в «SUBSYSTEM: WINDOWS». Вам необходимо сначала изменить это, перейдя по ссылке:
Проект -> Свойства -> Компоновщик -> Система -> Подсистема
И выберите «Консоль (/ SUBSYSTEM: CONSOLE)» из раскрывающегося списка.
Теперь программа не запустится, так как вместо функции «WinMain» нужна функция «main».
Итак, теперь вы можете добавить «основную» функцию, как обычно в C ++. После этого, чтобы запустить программу GUI, вы можете вызвать функцию «WinMain» изнутри функции «main».
Начальная часть вашей программы должна теперь выглядеть примерно так:
Результат моей реализации
Теперь вы можете использовать функции для вывода на консоль в любой части программы с графическим интерфейсом пользователя для отладки или других целей.
источник
Вы также можете использовать метод WriteConsole для печати на консоли.
источник