Как создать функцию только для отладки, которая принимает список переменных аргументов? Мне нравится printf () - PullRequest
37 голосов
/ 19 августа 2008

Я бы хотел создать функцию ведения журнала отладки с теми же параметрами, что и printf. Но тот, который может быть удален препроцессором во время оптимизированных сборок.

Например:

Debug_Print("Warning: value %d > 3!\n", value);

Я смотрел макросы variadic, но они доступны не на всех платформах. gcc поддерживает их, msvc не поддерживает.

Ответы [ 13 ]

0 голосов
/ 28 августа 2016

Это версия ответа пользователя TCHAR, поэтому она будет работать как ASCII ( normal ) или Unicode (более или менее).

#define DEBUG_OUT( fmt, ...) DEBUG_OUT_TCHAR(       \
            TEXT(##fmt), ##__VA_ARGS__ )
#define DEBUG_OUT_TCHAR( fmt, ...)                  \
            Trace( TEXT("[DEBUG]") #fmt,            \
            ##__VA_ARGS__ )
void Trace(LPCTSTR format, ...)
{
    LPTSTR OutputBuf;
    OutputBuf = (LPTSTR)LocalAlloc(LMEM_ZEROINIT,   \
            (size_t)(4096 * sizeof(TCHAR)));
    va_list args;
    va_start(args, format);
    int nBuf;
    _vstprintf_s(OutputBuf, 4095, format, args);
    ::OutputDebugString(OutputBuf);
    va_end(args);
    LocalFree(OutputBuf); // tyvm @sam shaw
}

Я говорю «более или менее», потому что он не будет автоматически преобразовывать строковые аргументы ASCII в WCHAR, но он должен вытащить вас из большинства фрагментов Unicode, не беспокоясь о переносе строки формата в TEXT ) или перед ним с L.

В основном получено из MSDN: получение кода последней ошибки

0 голосов
/ 08 августа 2013

Вот что я использую:

inline void DPRINTF(int level, char *format, ...)
{
#    ifdef _DEBUG_LOG
        va_list args;
        va_start(args, format);
        if(debugPrint & level) {
                vfprintf(stdout, format, args);
        }
        va_end(args);
#    endif /* _DEBUG_LOG */
}

, который абсолютно ничего не стоит во время выполнения, когда флаг _DEBUG_LOG выключен.

0 голосов
/ 23 октября 2012

Столкнувшись с проблемой сегодня, я решил следующий макрос:

    static TCHAR __DEBUG_BUF[1024]
    #define DLog(fmt, ...)  swprintf(__DEBUG_BUF, fmt, ##__VA_ARGS__); OutputDebugString(__DEBUG_BUF) 

Затем вы можете вызвать функцию следующим образом:

    int value = 42;
    DLog(L"The answer is: %d\n", value);
...