科技行者

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

知识库

知识库 安全导航

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

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

  • 扫一扫
    分享文章到微信

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

将结构 ext2_file_operations 的元素 llseek 初始化为 generic_file_llseek, 元素 read 初始化为 genenric_file_read,依次类推。

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

关键字: 使用 内核 扩展 Linux

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

将结构 ext2_file_operations 的元素 llseek 初始化为 generic_file_llseek,

元素 read 初始化为 genenric_file_read,依次类推。我觉得这是 GNU C 扩展中

最好的特性之一,当结构的定义变化以至元素的偏移改变时,这种初始化方法仍然

保证已知元素的正确性。对于未出现在初始化中的元素,其初值为 0。

Case 范围

=========

GNU C 允许在一个 case 标号中指定一个连续范围的值,例如:

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

1062: case '0' ... '9': c -= '0'; break;

1063: case 'a' ... 'f': c -= 'a'-10; break;

1064: case 'A' ... 'F': c -= 'A'-10; break;

case '0' ... '9':

相当于

case '0': case '1': case '2': case '3': case '4':

case '5': case '6': case '7': case '8': case '9':

声明的特殊属性

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

GNU C 允许声明函数、变量和类型的特殊属性,以便手工的代码优化和更仔细的代

码检查。要指定一个声明的属性,在声明后写

__attribute__ (( ATTRIBUTE ))

其中 ATTRIBUTE 是属性说明,多个属性以逗号分隔。GNU C 支持十几个属性,这

里介绍最常用的:

* noreturn

属性 noreturn 用于函数,表示该函数从不返回。这可以让编译器生成稍微优化的

代码,最重要的是可以消除不必要的警告信息比如未初使化的变量。例如:

++++ include/linux/kernel.h

47: # define ATTRIB_NORET __attribute__((noreturn)) ....

61: asmlinkage NORET_TYPE void do_exit(long error_code)

ATTRIB_NORET;

* format (ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)

属性 format 用于函数,表示该函数使用 printf, scanf 或 strftime 风格的参

数,使用这类函数最容易犯的错误是格式串与参数不匹配,指定 format 属性可以

让编译器根据格式串检查参数类型。例如:

++++ include/linux/kernel.h?

89: asmlinkage int printk(const char * fmt, ...)

90: __attribute__ ((format (printf, 1, 2)));

表示第一个参数是格式串,从第二个参数起根据格式串检查参数。

* unused

属性 unused 用于函数和变量,表示该函数或变量可能不使用,这个属性可以避免

编译器产生警告信息。

* section ("section-name")

属性 section 用于函数和变量,通常编译器将函数放在 .text 节,变量放在

.data 或 .bss 节,使用 section 属性,可以让编译器将函数或变量放在指定的

节中。

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

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

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