2012-03-16 44 views
0

我有什么感觉像一个简单的问题,但我似乎无法弄清楚如何解决它。我有一个我正在移植到Android的大型应用程序。该代码与许多日志调用散落,看起来像下面这样:重新定义记录的宏

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

我要重新定义LOG_WARN是combatible与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只是 “味精”。同样的问题。
  2. 删除LOG_WARN第二个参数的圆括号。这实际上解决了这个问题,但在我的情况下这不是一个有效的解决方案,因为这会破坏其他平台的日志记录宏。
  3. 1和2 - 抱怨太多争论。

请帮忙!

UPDATE:

预处理后,调用如下:

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

你可以检查预处理器的输出,看看你是否需要这个? – 2012-03-16 14:38:06

+0

完成并更新了问题。 – Jake 2012-03-16 14:48:40

+0

可以删除括号并更改其他平台的宏吗? – Kevin 2012-03-16 14:49:19

回答

1

你可以安装你自己的,中间的功能,使用打印的原始的可变参数版本:

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

灿烂!这很好。谢谢老兄:-) – Jake 2012-03-16 15:43:23

+0

我会在下周尝试一下你的更新,如果它有效的话,那肯定是更好的解决方案。 – Jake 2012-03-16 16:02:21