我有一个简单的问题,但似乎无法解决。我有一个要移植到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值,但其他具有其他变量类型的调用会给出相同的转换错误,但该类型会引起相同的转换错误。我尝试过的


将...和VA_ARGS交换为“ msg”。同样的问题。
删除LOG_WARN的第二个参数周围的括号。这实际上可以解决问题,但是在我看来,这不是一个有效的解决方案,因为这会破坏其他平台的日志记录宏。
1和2都抱怨参数过多。


请帮忙!

更新:

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

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

最佳答案

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

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

关于c++ - 重新定义用于记录的宏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9739175/

10-10 16:56