为数组元素赋值时出错

时间:2014-05-07 23:26:55

标签: c linux-kernel kvm

我需要做什么: 修改Linux内核代码(从kernel.org下载的3.13.6)。查找调用kvm_vmx_exit_handler函数的次数。

我想做什么: 在'x86.h'文件中声明一个数组

 extern unsigned long int my_count_s[40];

文件x86.h,它包含在'vmx.c'文件中

#include "x86.h"

现在,我正在尝试将数组中的元素初始化为文件'vmx.c'中的值0。

my_count_s[1] = 0;

每次调用kvm_exit_handler函数时,我都会递增它。我将了解kvm在发生事件时退出的次数,以及调用特定退出处理函数的次数。我将为每个exithandler函数使用数组的单个元素。

我遇到的错误:

arch/x86/kvm/vmx.c:58:1: warning: data definition has no type or storage class [enabled by default]
arch/x86/kvm/vmx.c:58:1: error: type defaults to ‘int’ in declaration of ‘my_count_s’ [-Werror=implicit-int]
arch/x86/kvm/vmx.c:58:1: error: conflicting types for ‘my_count_s’
arch/x86/kvm/x86.h:8:26: note: previous declaration of ‘my_count_s’ was here
arch/x86/kvm/vmx.c:58:1: error: invalid initializer

我的理解: 我已经将my_count_s [40]的数据类型声明为unsigned long int,但为什么它被默认为'int'? 即使它是默认的ti数据类型'int',为什么行my_count_s [1] = 0会出现初始化错误; ?

注意: 1. vmx.c中的第58行是“my_count_s [1] = 0;” 2.如果我通过声明数组来编译内核,它工作正常,但在我尝试为数组中的元素赋值时会弹出错误。

2 个答案:

答案 0 :(得分:2)

声明,包括作业必须是内部功能。我打赌你的功能超出了功能。

编译器很困惑,因为=只能出现在声明和语句中,并且因为它在函数外部,所以你的行被解析为声明。那是行不通的;哪种类型?

答案 1 :(得分:-1)

问题是,即使你的头文件中有这个:

extern unsigned long int my_count_s[40];

你仍然没有在任何地方定义数组 - 你只是声明它存在某处

在某些源文件(可能是arch/x6/kvm/vmx.c)中,您需要定义数组:

unsigned long int my_count_s[40];

请记住,extern说“嘿编译器,这个变量存在于某个模块中。”这就是我们在头文件中放置extern 声明的原因。它们实际上并没有为变量分配任何空间,它们只表明它的存在。

没有extern的行是定义,并放在.c文件中。在该编译单元中,实际上为变量保留了空间。


另一方面。此变量是否需要是全局范围的?如果arch/x6/kvm/vmx.c是唯一引用它的文件,那么它不应该在头文件中,并且应该在static文件中标记为.c

static unsigned long int my_count_s[40];

此处,static将其可见性限制为仅定义在其中的C文件。