linux驱动程序中的结构体成员前的点“.”是什么?

结构体赋值方法

在查看linux内核中的驱动程序时,结构体成员前总是有个点“.”,这是什么玩意,越看越懵了。
下面是网友总结的内容,引自:http://blog.chinaunix.net/uid-29033331-id-3811134.html
在阅读GNU/Linux内核代码时,我们会遇到一种特殊的结构初始化方式。该方式是某些C教材(如谭二版、K&R二版)中没有介绍过的。这种方式称为指定初始化(designated initializer)。下面我们看一个例子,Linux-2.6.x/drivers/usb/storage/usb.c中有这样一个结构体初始化 项目:
static struct usb_driver usb_storage_driver = {
.owner = THIS_MODULE,
.name = \”usb-storage\”,
.probe = storage_probe,
.disconnect = storage_disconnect,
.id_table = storage_usb_ids, };
乍一看,这与我们之前学过的结构体初始化差距甚远。其实这就是前面所说的指定初始化在Linux设备驱动程序中的一个应用,它源自ISO C99标准。以下我摘录了C Primer Plus第五版中相关章节的内容,从而就可以很好的理解2.6版内核采用这种方式的优势就在于由此初始化不必严格按照定义时的顺序。这带来了极大的灵活 性,其更大的益处还有待大家在开发中结合自身的应用慢慢体会。 已知一个结构,定义如下
struct book {
char title[MAXTITL];
char author[MAXAUTL];
float value; };
C99支持结构的指定初始化项目,其语法与数组的指定初始化项目近似。只是,结构的指定初始化项目使用点运算符和成员名(而不是方括号和索引值)来标识具体的元素。例如,只初始化book结构的成员value,可以这样做:
struct book surprise = { .value = 10.99 };
可以按照任意的顺序使用指定初始化项目:
struct book gift = {
.value = 25.99,
.author = \”James Broadfool\”,
.title = \”Rue for the Toad\”};
正像数组一样,跟在一个指定初始化项目之后的常规初始化项目为跟在指定成员后的成员提供了初始值。

这种结构体指定初始化的优点:
(1)可以不用严格按照结构体定义时的顺序进行初始化,顺序很随意,想怎么变就怎么变;
(2)可以只初始化部分成员,不想初始化的成员可以不用管;
(3)结构体的整体感比较清晰;
下面来看看结构体初始化的一些对比:
A方法

  struct student {
    char *name; //姓名
    int num; //学号
    int age; //年龄
    char group; //所在小组
    float score; //成绩
  } stu1;
  //给结构体成员赋值
  stu1.name = "Tom";
  stu1.num = 12;
  stu1.age = 18;
  stu1.group = 'A';
  stu1.score = 136.5;

A方法是我们比较容易理解的赋值方法,可以单独给每个成员赋值,顺序也可以随意,也可以只赋值部分成员,但整体性感觉差那么点。
B方法

  struct student {
    char *name; //姓名
    int num; //学号
    int age; //年龄
    char group; //所在小组
    float score; //成绩
  } ;
  struct student stu1 ={"Tom",12,18,"A",136.5};  //给结构体成员赋值

B方法也比较常见,不过这种方法赋值的顺序必须严格与结构体定义的一致(这样才能与结构体内的成员一一对应),且赋值必须为全部的成员(有些时候缺省的成员赋值是默认值),B方法就感觉有点死板了。
下面来看本文提的这种C方法:

  struct student stu1={
    .score=136.5; //成绩
    .age=18; //年龄
    .group="A"; //所在小组
  } ;

C方法中,成员的初始化顺序可以随意变,这样初始化整体感也比较清晰,也可以只进行某一个或某几个成员的初始化,如:struct student stu1={ .score=136.5; } ;
这样来看,C方法像不像是A方法和B方法的结合,取他们的优点集合而成。

linux中常用的结构体赋值方法:

linux中常见的赋值操作有两种,Linux内核编程的相关书籍中看到以下中方法一较多,周立功编写的linux系统构建于驱动程序开发范例中见到的是以下提到的方法二,都可以成功。

赋值操作 方法一:

static struct file_operations File_Ops_4_Our_Proc_File = {
.read = module_output,
.write = module_input,
.open = module_open,
.release = module_close,
};

赋值操作 方法二:

static struct file_operations File_Ops_4_Our_Proc_File = {
read : module_output,
write : module_input,
open : module_open,
release : module_close,
};

猜你喜欢

转载自blog.csdn.net/u014470361/article/details/80908229