Переопределение макросов для регистрации - PullRequest
0 голосов
/ 16 марта 2012

У меня есть то, что кажется простой проблемой, но я просто не могу понять, как ее решить.У меня есть большое приложение, которое я портирую на Android.Код полон множества вызовов журнала, которые выглядят следующим образом:

LOG_WARN(s_debugHandle, ("OpenGL error detected on entry. (Error:0x%x).",glError));

Я хочу переопределить LOG_WARN для совместимости с Android.То, что я сделал, выглядит следующим образом:

#define LOG_WARN(handle, ...)   __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)

Когда я компилирую это, компилятор говорит мне следующее:

error: invalid conversion from 'int' to 'const char*'
error: initializing argument 3 of 'int __android_log_print(int, const char*, const char*, ...)'

glError - это int, но другие вызовы с другими типами переменных даютта же ошибка преобразования, но вместо этого типа.Что я пробовал:

  1. Обмен ... и VA_ARGS только для "msg".Та же проблема.
  2. Удаление скобок вокруг второго аргумента LOG_WARN.Это на самом деле решает проблему, но в моем случае это недопустимое решение, так как это нарушит макросы журналов других платформ.
  3. И 1, и 2 - жалуется на слишком много аргументов.

Пожалуйста, помогите!

ОБНОВЛЕНИЕ:

После предварительной обработки вызов выглядит следующим образом:

__android_log_print(ANDROID_LOG_WARN, "debug", ("OpenGL error detected on entry. (Error:0x%x).",glError));

1 Ответ

1 голос
/ 16 марта 2012

Вы можете установить собственную промежуточную функцию, используя вариативную версию примитива печати:

#include <cstdarg>

void forward_debug(const char * fmt, ...)
{
    std::va_list ap;
    va_start(ap, fmt);
    __android_log_vprint(ANDROID_LOG_WARN, LOG_TAG, fmt, ap);
    va_end(ap);
}

#define LOG_WARN(ignore, x) forward_debug x

Обновление: вот еще одна идея:

#define SPLIT(...) __VA_ARGS__
#define LOG_WARN(ignore, x) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, SPLIT x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...