我有一个简单的问题,但似乎无法解决。我有一个要移植到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/