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

来源:互联网 发布:淘宝密码找回密码页面 编辑:程序博客网 时间:2024/06/05 09:39

在标准C中(C89)结构标准初始化是用{}来实始化,在C99的版本,采用了采用可读性更强的标记化实始化,这在LINUX内核和驱动很为常见。

这是ISO C99的用法

C Primer Plus第五版中相关章节:

已知一个结构,定义如下
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"
};
正像数组一样,跟在一个指定初始化项目之后的常规初始化项目为跟在指定成员后的成员提供了初始值。另外,对特定成员的最后一次赋值是它实际获得的值。例如,考虑下列声明:
struct book gift = {
       .value   = 18.90,
       .author = "Philionna pestle",
       0.25         //value=0.25
    };

 

struct name_str{
 int data;
 char name[120];
 int num;
};
/* 标记式初始化,注意顺序不同,并可缺省 */
struct name_str str ={
  .num = 100;
  .name = "hxy"; 
};

/* C89 初始化 */

struct name_str str2 =
{
 100,"Andrew Huang",-2
};

/* gcc 扩展初始化 */
struct name_str str3 =
{
  name:"bluedrum";
  data:-1
}

在Linux2.6内核中对结构体的定义形式发生了变化,不再支持原来的定义形式。

static struct file_operations test_ops = {

     .open = test_open,

     .read = test_read

     .write = test_write,

};

 ----------------------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
struct operators
{
     void (*read1)(char *);
     void (*read2)(char *);
     void (*read3)(char *);
     int n;
};
 
void read1(char *data)
{
     printf("read1: %s/n",data);
}
void read2(char *data)
{
     printf("read2: %s/n",data);
}
void read3(char *data)
{
     printf("read3: %s/n",data);
}
 
int main()
{    //传统的初始化方法
     //struct operators my_op = {read1, read2, read3, 100};    //所谓的标记化结构初始化语法
     struct operators my_op = {.read2 = read2,
                               .read1 = read1,
                               .read3 = read3,
                               .n = 100};
     my_op.read1("wangyang");
     my_op.read2("wangyang");
     my_op.read3("wangyang");
     return 0;
}