郑州信息科技中专职业学院中专部

不仅仅统招学历哟

  • 热门专业!
  • 大学校园!
  • 就业保障!
  • 拿学历又能高薪就业,谁能不爱!
了解详情>
郑州北大青鸟翔天信鸽参加“安心学习·放心就业”公约签约仪式

让每一个家庭“安心”、“放心”

  • 教学为本
  • 师爱为魂
  • 安心学习
  • 放心就业
了解详情>
北大青鸟20周年庆典与总部年会郑州翔天信鸽荣获7项荣誉

深耕细作IT职业教育15载

  • 青鸟之星教学质量大奖
  • 卓越风云人物
  • 北大青鸟中心理事会成员
  • 七项荣耀载誉而行!
了解详情>
郑州北大青鸟学员喜获全国IT精英挑战赛冠军

我们教学怎么样

  • 实力见证
  • 网络组一等奖
  • 网络组二等奖
  • 软件组四等奖
  • 200家校区脱颖而出!
了解更多>
北大青鸟荣获315重承诺守信用放心品牌

北大青鸟职业IT20周年

  • 重承诺
  • 守信用
  • 放心品牌
  • 放心学习
  • 靠靠谱谱好就业!
了解更多>
学IT好工作高薪就业

我命由我不由天

  • 学个性的技术
  • 做爱做的事
  • 挣满意的钱
  • 衣食无忧
  • 选择宽且高大尚!
了解更多>
郑州北大青鸟IT培训办学14年

我们靠不靠谱

  • 14年办学
  • 14年磨练
  • 14年成长
  • 14年探索
  • 只为让每个学员成材!
了解更多>
郑州北大青鸟IT培训

不打工也牛掰

  • 好工作
  • 好环境
  • 高薪资
  • 好课程
  • 支持你成为有“钱”人!
了解更多>

学IT就读北大青鸟

  • 好工作
  • 好未来
  • 好老师
  • 好课程
  • 支持你成为受人尊敬的人!
了解更多>
郑州北大青鸟:Linux内核代码 结构体初始化
作者: 添加时间:10-13 浏览次数:0

      今天我们郑州北大青鸟电脑培训给大家分享的知识点是: Linux内核代码结构体的初始化。这些都是我们在以后的工作学习中的必备知识积累。

       在阅读GNU/Linux内核代码时,我们会遇到一种特殊的结构初始化方式。该方式是某些C教材中没有介绍过的。这种方式称为指定初始化(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"};    
正像数组一样,跟在一个指定初始化项目之后的常规初始化项目为跟在指定成员后的成员提供了初始值。另外,对特定成员的最后一次赋值是它实际获得的值。例如,考虑下列声明:    
struct book gift = { .value = 18.90,                                   
.author = "Philionna pestle",                                    
0.25};    
这将把值0.25赋给成员value,因为它在结构声明中紧跟在author成员之后。新的值0.25代替了早先的赋值18.90。     有关designated initializer的进一步信息可以参考c99标准的6.7.8节Ininialization。
特定的初始化
  标准C89需要初始化语句的元素以固定的顺序出现,和被初始化的数组或结构体中的元素顺序一样。在ISO C99中,你可以按任何顺序给出这些元素,指明它们对应的数组的下标或结构体的成员名,并且GNU C也把这作为C89模式下的一个扩展。这个扩展没有在GNU C++中实现。为了指定一个数组下标,在元素值的前面写上“[index] =”。比如: int a[6] = { [4] = 29, [2] = 15 };
  相当于: int a[6] = { 0, 0, 15, 0, 29, 0 };
  下标值必须是常量表达式,即使被初始化的数组是自动的。一个可替代这的语法是在元素值前面写上“.[index]”,没有“=”,但从GCC 2.5开始就不再被使用,但GCC仍然接受。 为了把一系列的元素初始化为相同的值,写为“[first ... last] = value”。这是一个GNU扩展。比如: int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
  如果其中的值有副作用,这个副作用将只发生一次,而不是范围内的每次初始化一次。注意,数组的长度是指定的最大值加一。在结构体的初始化语句中,在元素值的前面用“.fieldname = ”指定要初始化的成员名。例如,给定下面的结构体, struct point { int x, y; };
  和下面的初始化, struct point p = { .y = yvalue, .x = xvalue };
  等价于: struct point p = { xvalue, yvalue };
  另一有相同含义的语法是“.fieldname:”,不过从GCC 2.5开始废除了,就像这里所示: struct point p = { y: yvalue, x: xvalue };
  “[index]”或“.fieldname”就是指示符。在初始化共同体时,你也可以使用一个指示符(或不再使用的冒号语法),来指定共同体的哪个元素应该使用。比如: union foo { int i; double d; }; union foo f = { .d = 4 };
  将会使用第二个元素把4转换成一个double类型来在共同体存放。相反,把4转换成union foo类型将会把它作为整数i存入共同体,既然它是一个整数。(参考5.24节向共同体类型转换。)你可以把这种命名元素的技术和连续元素的普通C初始化结合起来。每个没有指示符的初始化元素应用于数组或结构体中的下一个连续的元素。比如, int a[6] = { [1] = v1, v2, [4] = v4 };
  等价于 int a[6] = { 0, v1, v2, 0, v4, 0 };
  当下标是字符或者属于enum类型时,标识数组初始化语句的元素特别有用。例如: int whitespace[256] = { [' '] = 1, ['\t'] = 1, ['\h'] = 1, ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };
  你也可以在“=”前面写上一系列的“.fieldname”和“[index]”指示符来指定一个要初始化的嵌套的子对象;这个列表是相对于和最近的花括号对一致的子对象。比如,用上面的struct point声明: struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };
  如果同一个成员被初始化多次,它将从最后一次初始化中取值。如果任何这样的覆盖初始化有副作用,副作用发生与否是非指定的。目前,gcc会舍弃它们并产生一个警告。

       以上就是详细的介绍了结构体初始化的具体操作,大家回去在实际联系下,加深理解记忆。想要了解更多有关数据库知识的请查看:http://www.hnbenet.com/html/jsjl/sjk/  本文源自:http://www.hnbenet.com 转载请注明出处!


本文由站河南北大青鸟校区整编而成,如需了解更多IT资讯类的文章、新闻、课程和学习技巧、就业案例、招生详情等问题,可以对在线咨询老师进行一对一问答!


分享到: