在看Linux driver时,发现code的中关于file_operations被初始化为如下形式:
struct file_operations scull_fops ={
.owner = THIS_MODULE,
.llseek = scull_llseek,
.read = scull_read,
.write = scull_write,
...
...
}
书上说“因为它使驱动程序在结构定义发生变化时更具可移植性,并且使得代码更加紧凑且易读。标记化方法允许对结构成员进行重新排列。”
怎么理解呢?我这边举个例说明一下:
struct operators
{
void(*read)(char *);
void (*write)(char *);
int n;
};
void read(char *data)
{
printf("read: %s/n",data);
}
void write(char *data)
{
printf("write: %s/n",data);
}
int main()
{ //1、一般初始化方法
//struct operators op_1 = {read, write, 20};
//2、标记化结构初始化语法
struct operators op_1 = {
.read = read,
.write = write,
.n = 20,
};
return 0;
}
那么它们差别在哪呢?
(1)简洁明了,紧凑且易读,我们不要记住传参的位置,code更具有可读性。第一种情况,你可能需要查看结构体才能清楚哪参数对应哪个,而第二种则一目了然。
(2)可以选择性传参,能随意排序赋值。第一种情况,如果你只想对第三个变量进行初始化,那么你不得不给第一个,第二个参数进行初始化,而有时候一个变量并没有很合适的默认值,而使用标记初始化法,你可以直接对需要赋值参数进行初始化;并且你可以对结构体的成员随意排序赋值,这是传统方法无法做到的。
(3)结构体发生变化时移植性更好,如果你要在该结构体中增加或减少一个变量,第一种情况下,你需要知道所要修改的变量的位置,然后在参数列表中修改。而第二种情况,就可以根据变量直接添加或删除,更加直观。