内核模块中的警告:预期'struct rwlock_t *'但参数的类型为'struct rwlock_t *'

时间:2013-10-24 11:58:07

标签: linux-kernel spinlock

当我使用下面的读写器螺旋锁时,我收到一个奇怪的编译器警告

在a.c中定义

struct rwloct_t  rwspinlock.
rwlock_init(&rwspinlock);

在b.c中使用声明

extern struct rwloct_t  rwspinlock

所以,在 b.c 每当我调用锁定或解锁时,例如。read_rwlock(&rwspinlock)我都会收到以下警告。

warning: passing argument 1 of ‘_raw_read_lock_bh’ from incompatible pointer type
/home/dev/data/linux/linux/include/linux/rwlock_api_smp.h:20: note: expected ‘struct rwlock_t *’ but argument is of type ‘struct rwlock_t *’

然后,我改变如下, 在a.c

中定义
struct rwloct_t  rwspinlock.
rwlock_init(&rwspinlock);
在a.h中声明

 extern struct rwloct_t  rwspinlock

包含在b.c中,

#include "a.h"

现在没有编译警告。但是,我不清楚如何! 任何人都能解释一下,究竟发生了什么?

1 个答案:

答案 0 :(得分:1)

也许您的rwloct_t已定义为typedef)作为结构(此处为_t后缀)?

如果是这样,您不需要再次使用struct:

rwloct_t rwspinlock;

extern rwloct_t rwspinlock;

为什么它在.h而非.c内有效?我不知道,但是您可以尝试使用gcc和选项-E进行预编译,看看是否存在一些差异,否则我猜是编译器的内部原因。