Linux驱动学习:一些编程特点


以下基于宋宝华老师的《Linux设备驱动开发详解》

  1. typeof():关键字,可以获得指定变量的类型
  2. 当前函数名:GNU C预定义了两个标识符保存当前函数的名字
    1. __FUNCTION__:保存函数在源码中的名字
    2. __PRETTY_FUNCTION__:保存带语言特色的名字
      1. C函数中,这两个名字是相同的
    3. C99以及支持__func__宏,推荐使用__func__宏,而不是__FUNCTION__

特殊属性声明

GNU C允许声明函数、变量和类型的特殊属性。要指定一个声明的属性,只需要在声明后添加__attribute__((ATTRIBUTE)),其中ATTRIBUTE为属性说明,属性之间以逗号分隔。

noreturn作用于函数,表示该函数从不返回

#define ATTRIB_NORET __attribute__((noreturn))
asmlinkage NORET_TYPE void do_exit(long error_code) ATTRIB_NORET;
  1. 声明了一个具有特殊调用约定和无返回值的内核函数。通常用于在内核中终止当前进程或线程的执行
  2. NORET_TYPE为自定义宏,表明该函数无返回值

format作用 于函数,表示该函数使用printfscanfstrftime风格的参数,指定该属性可以让编译器根据格式串检查参数类型

asmlinkage int printk(const char* fmt,...) __attribute__ ((format (printf,1,2)));

unused作用于函数和变量,表示该函数和变量可能不会用到,该属性可以避免编译器产生警告信息

aligned用于变量、结构体和联合体,指定变量、结构体和联合体的对齐方式,以字节为单位

struct example_struct{
    char a;
    int b;
    long c;
}__attribute__((aligned(4)));

packed作用于变量和类型,用于变量和结构体成员时,表示使用最小可能的对齐;用于枚举、结构体或联合体类型时,表示该类型使用最小的内存。

内建函数

大部分内建函数是标准C库函数的GNU C编译器内建版本,比如memcpy()等,与对应的标准C库函数功能相同。
而不属于库函数的其他内建函数的命名通常以__builtin开始,如下

  1. __builtin_return_address(LEVEL):返回当前函数或其调用者的返回地址,参数指定调用栈的级数。0表示当前函数的返回地址,1表示当前函数调用者的返回地址
  2. __builtin_constant_p(EXP):用于判断一个值是否为编译时常数,如果参数EXP的值是常数,则函数返回1,否则返回0
  3. __builtin_expect(EXP,C):用于为编译器提供分支预测信息,其返回值是整数表达式EXP的值,C的值必须是编译时常数。该函数主要用于优化,暗示某一个分支的可能性是更高的
  4. -ansi -pedantic:指定该编译选项,则代表不适用GNU扩展语法

do{…}while(0)

这个的作用是保证宏定义的使用者能编译错误地使用宏,不对其使用者做任何假设。如下

  1. 如果使用者if()后没接{}那么可能造成else无对应的情况
  2. 如果使用者调用宏后,接了;,那么也可能造成else无对应情况

其他作用

可以使用在函数中,用break替换掉return

goto语句

内核源码中,对goto使用的非常广泛,但一般只限于错误处理中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值