发送指向哈希表的指针会导致编译错误

时间:2014-08-17 09:42:32

标签: c data-structures linux-kernel

下面是一个内核模块,可以很好地编译和运行。我编写了一个方法show,它获取指向哈希表的指针并打印出来。但是,如果我使用方法参数b,我得到一个编译错误。我只能使用全局变量a。

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/hashtable.h>

MODULE_LICENSE("GPL");

typedef struct {
    int age;
    struct hlist_node my_next;
} my_type;

DEFINE_HASHTABLE(a, 3);
my_type *node1, *node2, *node3;

void show(struct hlist_head b[]){
    int i;
    my_type *temp;

    printk(KERN_INFO "a: %p \tb: %p \n", a, b);    // Always the same address.

    hash_for_each(a, i, temp, my_next){           // Change the a to b
        printk(KERN_INFO "%d\n", temp->age);
    }
}


int init_module(void){
    printk(KERN_INFO "Hi.\n");

    node1 = kmalloc(sizeof(my_type), GFP_KERNEL);
    node1->age = 28;
    node2 = kmalloc(sizeof(my_type), GFP_KERNEL);
    node2->age = 27;
    node3 = kmalloc(sizeof(my_type), GFP_KERNEL);
    node3->age = 20;

    show(a);
    hash_add(a, &node1->my_next, 0);
    hash_add(a, &node2->my_next, 1);
    hash_add(a, &node3->my_next, 1);
    show(a);

    return 0;
}


void cleanup_module(void){
    kfree(node1);
    kfree(node2);
    kfree(node);
    printk(KERN_INFO "Bye.\n");
}

我得到的错误是:

In file included from include/linux/thread_info.h:11:0,
             from /usr/src/kernels/3.15.8-200.fc20.x86_64/arch/x86/include/asm/preempt.h:6,
             from include/linux/preempt.h:18,
             from include/linux/spinlock.h:50,
             from include/linux/seqlock.h:35,
             from include/linux/time.h:5,
             from include/linux/stat.h:18,
             from include/linux/module.h:10,
             from /home/k/development/hash2/main.c:1:
/home/k/development/hash2/main.c: In function ‘show’:
include/linux/bug.h:33:45: error: negative width in bit-field ‘<anonymous>’
 #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
                                         ^

我尝试使用struct hlist_head * b[]这样的定义,并在hash_for_each宏中使用*b但未使用。
我也尝试在方法DEFINE_HASHTABLE(c, 3);中定义show(),如下所示,但它没用。

void show(struct hlist_head b[]){
    int i;
    my_type *temp;

    DEFINE_HASHTABLE(c, 3);
    printk(KERN_INFO "a: %p \tb: %p \n", a, b);

    hash_for_each(c, i, temp, my_next){
        printk(KERN_INFO "%d\n", temp->age);
    }
}

那么,为什么我会收到此错误?我该如何解决?

1 个答案:

答案 0 :(得分:2)

hash_for_each是一个宏,它又使用另一个宏(ARRAY_SIZE)来确定传递给hash_for_each的数组的大小作为第一个参数。

您将指向hash_for_each的指针作为第一个参数传递,这会使ARRAY_SIZE成为"pointers are not arrays"

要了解这一点,您可能希望采用 Paul R 提出的方法对他的问题进行评论,即将show()作为宏实现。

您观察到的编译错误是出于意图,使您无法使用不执行预期操作的代码。错误消息本身

error: negative width in bit-field ...
然而,这是非常误导的。