C语言的标记化结构初始化语法

在看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)结构体发生变化时移植性更好,如果你要在该结构体中增加或减少一个变量,第一种情况下,你需要知道所要修改的变量的位置,然后在参数列表中修改。而第二种情况,就可以根据变量直接添加或删除,更加直观。

猜你喜欢

转载自blog.csdn.net/shenjin_s/article/details/79673518