重新定义用于记录的宏

时间:2012-03-16 14:32:55

标签: c++ c macros

我感觉这是一个简单的问题,但我似乎无法弄清楚如何解决它。我有一个大型应用程序,我正在移植到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. 仅为“msg”交换...和 VA_ARGS 。同样的问题。
  2. 删除LOG_WARN第二个参数周围的括号。这实际上解决了它,但在我的情况下它不是一个有效的解决方案,因为这会破坏其他平台的日志记录宏。
  3. 1和2都抱怨过多论点。
  4. 请帮忙!

    更新:

    预处理后,调用如下所示:

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

1 个答案:

答案 0 :(得分:1)

您可以使用print原语的可变版本安装自己的中间函数:

#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)