Макрос кросс-платформенного журнала не работает в Windows - PullRequest
2 голосов
/ 11 февраля 2012

Я использую макрос для простой регистрации на разных платформах. Вот кое-что из того, что я использую на Android:

#include <android/log.h>
#define __ENGINE_LOG_INFO(msg, argptr) __android_log_vprint(ANDROID_LOG_INFO, __ENGINE_LOG_TAG, msg, argptr);

И вот что я попробовал на windows:

#elif defined _WIN32 || _WIN64
#include <stdarg.h>
#include <stdio.h>
#define __ENGINE_LOG_INFO(msg, argptr)  printf ("%s:%s",__ENGINE_LOG_TAG,"DEBUG:"); printf(msg, argptr); printf("\n");

Макрос вызывается в этой функции:

void LogManagerImpl::LogInfo(const char* msg, ...)
{
    va_list argptr;
    va_start(argptr, msg);
    __ENGINE_LOG_INFO(msg, argptr);
    va_end(argptr);
}

Например, я использую это так:

engine->GetLogger()->LogInfo("TEST: MemoryManagerTest:AllocateWithMemPool: Loop time: %d msec", timeStop - timeStart);

Это хорошо работает на Android, но по какой-то причине кажется, что в Windows выдается фиктивные значения (это всегда одно и то же значение - очень большое значение). Я начинаю думать, что это похоже на адрес, но я не уверен, почему он не работает. Есть идеи?

1 Ответ

2 голосов
/ 11 февраля 2012

Вы хотите использовать vprintf(msg, argptr); вместо printf(msg, argptr); в вашей версии Windows.Функция vprintf() была разработана для работы с типом va_list в качестве контейнера для фактических значений аргументов, которые будут сопоставляться со значениями, указанными во входной символьной строке, где printf() не было.

...