Использование целого числа для OutputDebugString в VS2017
Я некоторое время искал в Интернете, как вывести целое число или, возможно, число с плавающей запятой, используя OutputDebugString(). Было бы проще, если бы я мог записать свои данные отладки прямо в консоль из моего внешнего исполняемого файла, используя эту команду. Однако я получил его только для работы с const char. Решения, которые я нашел, устарели, я пытался копировать и вставлять код прямо из Интернета, но не работал. Даже после внесения изменений в код я не смог правильно передать его. Есть ли кто-нибудь, кто мог бы помочь мне привести что-то к типу в OutputDebugString настолько чисто, насколько это возможно, это только для целей отладки, поэтому я предпочитаю держать код коротким и легко читаемым, чем иметь более сложный и неуклюжий тип-IF, который возможен. Большое спасибо!
3 ответа
Предлагается альтернативное решение. Функция ниже инкапсулирует OutputDebugString, который может принимать форматированные аргументы.
#include <vector>
#include <string>
void DbgMsg(const char * zcFormat, ...)
{
// initialize use of the variable argument array
va_list vaArgs;
va_start(vaArgs, zcFormat);
// reliably acquire the size
// from a copy of the variable argument array
// and a functionally reliable call to mock the formatting
va_list vaArgsCopy;
va_copy(vaArgsCopy, vaArgs);
const int iLen = std::vsnprintf(NULL, 0, zcFormat, vaArgsCopy);
va_end(vaArgsCopy);
// return a formatted string without risking memory mismanagement
// and without assuming any compiler or platform specific behavior
std::vector<char> zc(iLen + 1);
std::vsnprintf(zc.data(), zc.size(), zcFormat, vaArgs);
va_end(vaArgs);
std::string strText(zc.data(), iLen);
OutputDebugStringA(strText.c_str());
}
Например, в приведенном ниже коде показано, как распечатать целочисленную переменную с помощью OutputDebugString через DbgMsg().
int foo=12;
DbgMsg(" foo=%d", foo);
OutputDebugString может принимать только строки, если вы хотите форматированный вывод, вам придется сделать это самостоятельно, прежде чем передать его в OutputDebugString. Если вы используете MSVC, я предлагаю вам использовать _CrtDbgReport или _CrtDbgReportW. В последних версиях MSVC, которые поддерживают макросы variadic, я использую следующее:
#if !defined(_RPTW)
#if defined(_DEBUG)
#define _RPTW(pszFmt, ...) _CrtDbgReportW(_CRT_WARN, NULL, __LINE__, NULL, (pszFmt), __VA_ARGS__)
#define _RPTW_(dest, fmt, ...) _CrtDbgReportW((dest), NULL, __LINE__, NULL, (pszFmt), __VA_ARGS__)
#else
#define _RPTW(pszFmt, ...)
#define _RPTW(dest, pszFmt)
#endif
#endif // #if !defined(_RPTW)
#if !defined(_RPTA)
#if defined(_DEBUG)
#define _RPTA(pszFmt, ...) _CrtDbgReport(_CRT_WARN, NULL, __LINE__, NULL, (pszFmt), __VA_ARGS__)
#define _RPTA_(dest, fmt, ...) _CrtDbgReport((dest), NULL, __LINE__, NULL, (pszFmt), __VA_ARGS__)
#else
#define _RPTA(pszFmt, ...)
#define _RPTA_(dest, pszFmt)
#endif
#endif // #if !defined(_RPTA)
#if !defined(_RPTT)
#if defined(_UNICODE)
#define _RPTT _RPTW
#define _RPTT_ _RPTW_
#else
#define _RPTT _RPTA
#define _RPTT_ _RPTA_
#endif
#endif // #if !defined(_RPTT)
Вторые формы позволяют предоставлять отчет другого уровня (_CRT_ASSERT или c_CRT_ERROR вместо _CRT_WARN)
Я бы рекомендовал использовать sprintf следующим образом:
// issues with the int x, let's output and look at it in DebugView
char msg[255] = {0};
sprintf(msg, ">> Watch out x=%d\n", x);
OutputDebugString(msg);
Может я не понял вопроса, но я так быстро сбрасываю целые числа. И если честно я не знаю этих МАКРОСОВ которые перечислил SoronelHaetir но ведь надо форматировать самому. Так что я надеюсь, что это поможет и довольно прямолинейно.