linux中副规则_Linux内核源代码中的语法规则

1)不常见的结构体初始化规则:

在阅读GNU/Linux内核代码时,我们会遇到一种特殊的结构初始化方式,称为指定初始化(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标准。采用这种初始化方式的优势就在于不必严格按照定义时的顺序进行初始化。这带来了极大的灵活性,其更大的益处还有待大家在开发中结合自身的应用慢慢体会。

已知一个结构,定义如下

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

2)inline关键字的使用

内联函数有些类似于宏。内联函数的代码会被直接嵌入在它被调用的地方2,调用几次就嵌入几次,没有使用call指令。这样省去了函数调用时的一些额外开销,比如保存和恢复函数返回地址等,可以加快速度。不过调用次数多的话,会使可执行文件变大,这样会降低速度。相比起宏来说,内核开发者一般更喜欢使用内联函数。因为内联函数没有长度限制,格式限制。编译器还可以检查函数调用方式,以防止其被误用。

static inline的内联函数,一般情况下不会产生函数本身的代码,而是全部被嵌入在被调用的地方。如果不加static,则表示该函数有可能会被其他编译单元所调用,所以一定会产生函数本身的代码。所以加了static,一般可令可执行文件变小。内核里一般见不到只用inline的情况,而都是使用static inline。

3)EXPORT_SYMBOL的使用

一个模块mod1中定义一个函数func1;在另外一个模块mod2中定义一个函数func2,func2调用func1。

在模块mod1中,EXPORT_SYMBOL(func1);

在模块mod2中,extern int func1();

就可以在mod2中调用func1了。

4)UL

UL常被用在数值常数后,标明该常数为"unsigned long"类型,UL(L代表long)负责告诉编译程序将这一数值当作long型数值来处理。因此,使用UL很有必要,它能够保证特定体系结构内的数据不会溢出其数据类型所规定的范围。涉及很大的数或长的位掩码时,使用UL有助于编写出与体系结构无关的代码。

Linux代码中有这样的例子,如:

include/linux/kernel.h

===============

#define INT_MAX  ((int)(~0U>>1))

#define INT_MIN  (-INT_MAX - 1)

#define UINT_MAX (~0U)

#define LONG_MAX ((long)(~0UL>>1))

#define LONG_MIN (-LONG_MAX - 1)

#define ULONG_MAX (~0UL)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值