syslog.h和android的log系统冲突问题

来源:互联网 发布:网络研修成果 编辑:程序博客网 时间:2024/05/18 04:20

http://blog.sina.com.cn/s/blog_5532e76a0102v6ys.html


1.现象

工作中发现一个问题,c文件不能打log,说明白点,就是不能调用ALOGE ALOGD ALOGV这些函数,会报错,类似下面的错误
{
  error: macro "LOG_PRI" passed 3 arguments, but takes just 1
  error: 'LOG_PRI' undeclared (first use in this function)
}

2.解决办法
研究发现,是因为包含了头文件”syslog.h“引起的冲突,去掉就ok了。

3.原因解析
ALOE函数的实现在”system/core/include/log/log.h“文件中,实现过程如下
#ifndef ALOGE
#define ALOGE(...) ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))
#endif

#ifndef ALOG
#define ALOG(priority, tag, ...) \
    LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__)
#endif

会调用到LOG_PRI,文件下半部分有LOG_PRI实现如下

#ifndef LOG_PRI
#define LOG_PRI(priority, tag, ...) \
    android_printLog(priority, tag, __VA_ARGS__)
#endif

这是正常的调用流程。

然而包含了"syslog.h"后,这个系统文件里也有对LOG_PRI的实现如下
#define LOG_PRI(x)    ((x) & LOG_PRIMASK)

因为系统文件syslog.h里的实现在前,优先级高,所以优先使用了,就造成了冲突。
想使用android的LOG系统,千万不要包含”syslog.h“文件,切记!
原创粉丝点击