博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[Linux]c in Linux Kernel

Posted on 2010-03-26 15:32  xuczhang  阅读(222)  评论(0编辑  收藏  举报

 

1. key word from c++

inline –> __inline__

asm –> __asm__

这里在关键字前后加上"__"的原因是inline等c++的关键字不是c的关键字,为了避免冲突。

2. attribute属性描述

struct foo {
    char a;
    int x;
}attribute__ ((packed));

比如上述代码就是压缩struct的存储方式,如果没有压缩就是8个BYTE,而packed之后是4BYTE。

3. do{}while(0)

image

为什么要用do{}while(0)呢?看下面这个例子:

image

如果使用:

image 

上面的代码就变成了:

image

会有编译错误,那如果加上{}改成:

image

代码就变成:

image

同样会有编译问题。更糟糕的是在一些情况下虽然编译可以通过不过出现逻辑不一致的问题,而使用do{}while(0)就能解决这样的问题,所以当在宏中出现多条语句的时候就应该使用do{}while(0)。

3. list_head

在linux内核中,linux_head使用相当普遍,有许多地方对list_head做了详细的描述,这里就不赘述了,其核心是

image

通过list_head在struct中的偏移量找到当前struct的地址。