今天在移植一个Linux C程序到 Android 源码层时遇到一个问题,记录下来已备其他遇到此类问题的朋友查阅:
In file included from ******.c:82:0:
bionic/libc/kernel/common/linux/sysctl.h:37:24: error: expected identifier or '(' before '[' token
查看sysctl.h代码, 如下
struct __sysctl_args {
int __user *name;
int nlen;
void __user *oldval;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
size_t __user *oldlenp;
void __user *newval;
size_t newlen;
unsigned long __unused[4];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
37行即:
unsigned long __unused[4];
原因是__unused这个成员名已经在其他地方被声明了,即
#define __unused ***
这里再使用的话就会报错,解决方案是在
******.c: 文件引用sysctl.h之前声明: #undef __unused,即:
#undef __unused
#include <linux/sysctl.h>
In file included from ******.c:82:0:
bionic/libc/kernel/common/linux/sysctl.h:37:24: error: expected identifier or '(' before '[' token
查看sysctl.h代码, 如下
struct __sysctl_args {
int __user *name;
int nlen;
void __user *oldval;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
size_t __user *oldlenp;
void __user *newval;
size_t newlen;
unsigned long __unused[4];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
37行即:
unsigned long __unused[4];
原因是__unused这个成员名已经在其他地方被声明了,即
#define __unused ***
这里再使用的话就会报错,解决方案是在
******.c: 文件引用sysctl.h之前声明: #undef __unused,即:
#undef __unused
#include <linux/sysctl.h>