科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道GNUC扩展:Linux操作系统的内核使用 (2)

GNUC扩展:Linux操作系统的内核使用 (2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

结构的最后一个元素定义为零长度数组,它不占结构的空间。在标准 C 中则需要 定义数组长度为 1,分配时计算对象大小比较复杂。

作者:lenn 来源:chinaunix 2007年11月3日

关键字: 使用 内核 扩展 Linux

  • 评论
  • 分享微博
  • 分享邮件
 

GNU C 允许使用零长度数组,在定义变长对象的头结构时,这个特性非常有用。例

如:

++++ include/linux/minix_fs.h

85: struct minix_dir_entry {

86: __u16 inode;

87: char name[0];

88: };

结构的最后一个元素定义为零长度数组,它不占结构的空间。在标准 C 中则需要

定义数组长度为 1,分配时计算对象大小比较复杂。

可变参数宏

==========

在 GNU C 中,宏可以接受可变数目的参数,就象函数一样,例如:

++++ include/linux/kernel.h

110: #define pr_debug(fmt,arg...) \

111: printk(KERN_DEBUG fmt,##arg)

这里 arg 表示其余的参数,可以是零个或多个,这些参数以及参数之间的逗号构

成 arg 的值,在宏扩展时替换 arg,例如:

pr_debug("%s:%d",filename,line)

扩展为

printk("<7>" "%s:%d", filename, line)

使用 ## 的原因是处理 arg 不匹配任何参数的情况,这时 arg 的值为空,GNU

C 预处理器在这种特殊情况下,丢弃 ## 之前的逗号,这样

pr_debug("success!\n")

扩展为

printk("<7>" "success!\n")

注意最后没有逗号。

标号元素

========

标准 C 要求数组或结构变量的初使化值必须以固定的顺序出现,在 GNU C 中,通

过指定索引或结构域名,允许初始化值以任意顺序出现。指定数组索引的方法是在

初始化值前写 '[INDEX] =',要指定一个范围使用 '[FIRST ... LAST] =' 的形式,

例如:

+++++ arch/i386/kernel/irq.c

1079: static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };

将数组的所有元素初使化为 ~0UL,这可以看做是一种简写形式。

要指定结构元素,在元素值前写 'FIELDNAME:',例如:

++++ fs/ext2/file.c

41: struct file_operations ext2_file_operations = {

42: llseek: generic_file_llseek,

43: read: generic_file_read,

44: write: generic_file_write,

45: ioctl: ext2_ioctl,

46: mmap: generic_file_mmap,

47: open: generic_file_open,

48: release: ext2_release_file,

49: fsync: ext2_sync_file,

50 };

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章