网址: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. 【数论】UVa 10586 - Polynomial Remains

    Problem F: Polynomial Remains Given the polynomial a(x) = an xn + ... + a1 x + a0, compute the remai ...

  2. hdu 4421 2-SAT问题

    思路:我们需要判断是否有满足的a[n],其实也就是对每一个二进制位进行判断,看是否有满足的.那么我们每次取出一个二进制位,这样每一位只有0,1两种状态,就成了比较典型的2-SAT问题了. #inclu ...

  3. 纯CSS3制作进度条源代码

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  4. WebStorm 8.0安装LESS编译环境的教程

    WebStorm是一个非常棒的Web前端开发编辑器,被程序猿们成为“最智能的JavaScript IDE”.对HTML5.Bootstrap框架.Node.js等都有完美支持.目前最新版本为WebSt ...

  5. jquery easyui datagrid 分页 详解(java)

    1.首先引入easyui包,可以在官方网站下载,http://www.jeasyui.com/download/index.php <link rel="stylesheet" ...

  6. C#几个经常犯错误汇总

    在我们平常编程中,时间久了有时候会形成一种习惯性的思维方式,形成固有的编程风格,但是有些地方是需要斟酌的,即使是一个很小的错误也可能会导致昂贵的代价,要学会善于总结,从错误中汲取教训,尽量不再犯同样错 ...

  7. Android Studio 创建aar包与引用

    两者区别:*.jar: 只包含了class文件与清单文件 ,不包含资源文件,如图片等所有res中的文件.*.aar: 包含所有资源 ,class以及res资源文件全部包含 一.创建aar包1.创建一个 ...

  8. 文件流操作(FileStream,StreamReader,StreamWriter)

    大文件拷贝: /// <summary> /// 大文件拷贝 /// </summary> /// <param name="sSource"> ...

  9. ASSERT报错:error C2664: “AfxAssertFailedLine”: 不能将参数 1 从“TCHAR []”转换为“LPCSTR”

    转载请注明来源:崨雁嫀筝 http://www.cnblogs.com/xuesongshu 这个错误是我在把tinyxml修改为宽字符(Unicode)版本时候遇到的问题,我首先按关键字把所有有ch ...

  10. 那万恶的ssh真是麻烦

    设置为允许某组远程ssh ,key也放入相应的服务器了,死活提示,Permission denied (publickey). 而偏偏另外的用户相同的配置却又可以,这里找到答案,原来是跟目录的权限有关 ...