Использование целого числа для 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 но ведь надо форматировать самому. Так что я надеюсь, что это поможет и довольно прямолинейно.

Другие вопросы по тегам