博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
标准C的标记化结构初始化语法
阅读量:6450 次
发布时间:2019-06-23

本文共 1391 字,大约阅读时间需要 4 分钟。

在标准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
    };

这将把值0.25赋给成员value,因为它在结构声明中紧跟在author成员之后。新的值0.25代替了早先的赋值18.90。

有关designated initializer的进一步信息可以参考c99标准的6.7.8节Ininialization。

其中VC++ 6.0只支持C89初始化,GCC支持自己标记化或自己扩展初始化。这种初始化采用 .name = value.这样不需要按顺序排序,方便调整实义,在大结构最大程度防止错位的和调整定义带来不便。

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,

};

 

这个声明采用了标记化结构初始化语法。这种写法是值得采用的,因为它使驱动程序在结构的定义发生变化时更具有可移植性,并且使代码更加紧凑且易读。标记化的初始化方法允许对结构成员进行重新排列。在某些场合下,将频繁被访问的成员放在相同的硬件缓存行上,将大大提高性能

转载地址:http://dxlwo.baihongyu.com/

你可能感兴趣的文章
Oracle单行函数和多行函数实例
查看>>
汤森路透拟35.5亿美元出售知识产权与科技业务
查看>>
城市大脑三项技术论文同时入选国际顶级学术会议ACM MM
查看>>
Bash远程命令执行漏洞(CVE-2014-6271)分析利用
查看>>
传软银千亿美元基金募资接近完成 最快将于下周宣布
查看>>
《嵌入式系统数字视频处理权威指南》——2.3数字视频:颜色空间
查看>>
建设智慧城市 成都市交委与滴滴出行签战略合作协议
查看>>
注意那些容易被忽略的SQL注入技巧
查看>>
《日志管理与分析权威指南》一1.2.3 什么是日志消息
查看>>
《金蝶ERP-K/3完全使用详解》——6.8 报表查询分析
查看>>
《Hadoop与大数据挖掘》一2.2.5 动手实践:Hadoop IDE配置
查看>>
《计算机系统:系统架构与操作系统的高度集成》——2.9 指令集体系结构选择...
查看>>
《贝叶斯思维:统计建模的Python学习法》——2.7 讨论
查看>>
《CCNP安全Secure 642-637认证考试指南》——8.5节完成助记表
查看>>
《Android应用开发》——1.1节下载开发软件
查看>>
《贝叶斯思维:统计建模的Python学习法》——1.7 Monty Hall难题
查看>>
升级TCP协议使网速提升30%,中国受益明显
查看>>
Go 语言对 Android 原生应用开发的支持情况
查看>>
《沟通的技术——让交流、会议与演讲更有效》一1.1 一切尽在计划之中
查看>>
Firefox 44 浏览器内建更好的 SSL 错误指示器
查看>>