网址:http://blog.chinaunix.net/uid-24807808-id-3219820.html

在看linux源码的时候,经常会看到类似于下面的结构体赋值的代码:

  1. struct device my_dev =
  2. {
  3. .bus = &my_bus_type,
  4. .parent = &my_bus,
  5. .release = my_dev_release,
  6. };

整体上看,貌似与我们平时遇到的结构题赋值差不多,可是在变量前面加了一个点,好像我们就不知道是什么意思了。
 
 上面的这种赋值方式成为指定初始化(designated initializer)。源自ISO C99标准。  
 C Primer Plus有比较详细的描述,如下:
已知一个结构体定义:

点击(此处)折叠或打开

struct book
{
    char title[MAXTITL];
    char author[MAXAUTL];
    float value;
};

C99支持结构体的指定初始化项目,其语法与数组的指定初始化近似。只是,结构体的指定初始化项目使用点运算符和成员名来标识具体的元素。
  
  例如,只初始化book结构体中的成员value,可以这样做:
struct book a = {.value = 10.99};    
  可以按照任意的顺序使用初始化项目:

点击(此处)折叠或打开

  1. struct book gift =
  2. {
  3. .value = 25.90,
  4. .author = "Li Cong",
  5. .title = "Love Linux",
  6. };

和数组一样,跟在一个制定初始化项目之后的常规初始化项目为跟在指定成员后的成员提供了初始值。另外,对特定成员的最后一次赋值是它实际获得的值。例如:

struct book gift =
{
    .value = 18.90,
    .author = "Li Cong",
    20.0
};
  这将把值20.0赋给成员value,因为它在结构声明中紧跟在author成员之后。新的值20.0代替了早先的赋值18.90。

注意:
1. 结构体指定初始化时,用到的就是点运算符加变量名,不许要指明类型,程序会自动匹配。
2. 右边的值类型尽量要匹配左边的类型。
3. 初始化时,变量之间可以用逗号分开,也可以用分号分开。
4. 整个结构体外边不要忘记分号。

内核采用这种方式的原因在于初始化时,不必严格按照定义时的顺序,这带来了极大的灵活性。

(转)关于linux中内核编程中结构体的赋值操作(结构体指定初始化)的更多相关文章

  1. C#中面向对象编程中的函数式编程详解

    介绍 使用函数式编程来丰富面向对象编程的想法是陈旧的.将函数编程功能添加到面向对象的语言中会带来面向对象编程设计的好处. 一些旧的和不太老的语言,具有函数式编程和面向对象的编程: 例如,Smallta ...

  2. Linux设备驱动编程中的中断与定时器处理

    所谓中断是指CPU在执行过程中,出现某些突发时间急待处理,CPU必须暂停执行当前的程序,转去处理突发事件,处理完毕后CPU又返回原程序被中断的位置并继续执行. 中断分为(根据中断源来分):  内部中断 ...

  3. Linux系统网络编程中TCP通讯socket--send导致进程被关闭

    https://blog.csdn.net/dsanmux/article/details/52083403 https://blog.csdn.net/u011425939/article/deta ...

  4. Linux下多线程编程中信号量介绍及简单使用

    在Linux中有两种方法用于处理线程同步:信号量和互斥量. 线程的信号量是一种特殊的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作.如果一个程序中有多个线程试图改变一个信号量的值,系统将保 ...

  5. linux实践——内核编程 基础模块

    一.内核模块的概念 Linux模块(module)是一些可以作为独立程序来编译的函数和数据类型的集合.内核模块给我们带来的便利是模块本身并不被编译进内核文件,可在内核运行期间动态的安装或卸载.因为如果 ...

  6. 嵌入式应用中CGI编程中POST、GET及环境变量详解

    原载地址:http://3633188.blog.51cto.com/3623188/828095 1.POST和GET      一个CGI程序在于服务器之间的信息传输和数据传输一般通过两种方法,即 ...

  7. linux shell脚本编程笔记(二): 分支结构

    1.if if command then commands fi if command then commands else commands fi if command1 then command ...

  8. Unix/Linux环境C编程入门教程(40) 初识文件操作

     1.函数介绍 close(关闭文件) 相关函数 open,fcntl,shutdown,unlink,fclose 表头文件 #include<unistd.h> 定义函数 int ...

  9. Unix/Linux环境C编程新手教程(40) 初识文件操作

     1.函数介绍 close(关闭文件) 相关函数 open,fcntl,shutdown.unlink,fclose 表头文件 #include<unistd.h> 定义函数 int ...

随机推荐

  1. VS操作Sqlite数据库

    如果你下载的Sqlite是不带bundle的版本,那还要把这个SQLite.Interop.dll复制到debug执行文件夹下才能执行.

  2. Java Concurrency - Phaser, Controlling phase change in concurrent phased tasks

    The Phaser class provides a method that is executed each time the phaser changes the phase. It's the ...

  3. 页面所有的button绑定同一个事件,点击不同的button赋值不同

    <script type="text/javascript"> $(function(){ $("input[type='button']").cl ...

  4. iOS 字体滚动效果 ScrollLabel

    写了一个简单的字体滚动效果. 用了一种取巧的方式,传入两个一摸一样的Label(当然也可以是别的视图), 话不多说,代码里面讲解. SEScrollLabel.h #import <UIKit/ ...

  5. 我的博客已搬迁到http://www.lsworks.net

    我的博客已搬迁到http://www.lsworks.net

  6. vim全局替换

    :1,$ s/cmss_//g 1,$代表第一行到最后一行 s代表替换 cmss_为要替换的内容 替换为空格,所以直接// g代表全局替换

  7. CMakeLists实战解读--YouCompleteMe

    原文转载自:Ricky.K http://www.cnblogs.com/rickyk/p/3877238.html 个人一直有一个想法,就是想出一系列关于CMakeLists.txt国外经典例子的实 ...

  8. ASP.NET 将DataTable解析成JSON简介

    这里解析json使用的是Newtonsoft.Json.dll程序集.下面请看code: using System; using System.Collections.Generic; using S ...

  9. [DevExpress]ChartControl之基准线示例

    关键代码: /// <summary> /// 创建基准线ConstantLine /// </summary> /// <param name="chart& ...

  10. ES6学习笔记(二)

    1.数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. var a = 1; va ...