__attribute__
对于关键字__attribute__,在标准和C语言中是没有的。它是GCC中对C语言的一个扩展用法。可以用来设置一个函数或数据结构定义的属性,对一个函数设置属性的主要目的是使编译器对函数进行可能的优化。
可以在同一个定义中,设置多个属性,各个属性用逗号分开即可。如下面的定义就是告诉编译器,它不改变全局变量和该函数不能扩展为内联函数。
Int getlim() __attribute__((pure, noinline));
也可以用来设置变量和结构体的成员。如,为了保证结构体中的一个成员变量与结构体有特殊方式的对齐,可以用以下形式定义:
struct mong{
char id;
int code __attribute__((align(4)));
};
Typedef
关键字typedef返回的是表达式的类型,使用上类似于关键字sizeof,但它的返回值是类型,而不是一个大小。下面是一些例子:
Char *chptr;//a char pointer
Typedef (*chptr) ch;//a char
Typedef (ch) *chptr2; //a char pointer
Asmlinkage和fastcall
Asmlinkage在内核源码中出现的频率非常高,它是告诉编译器在本地堆栈中传递参数,与之对应的是fastcall;fastcall是告诉编译器在通用寄存器中传递参数。运行时,直接从通用寄存器中取函数参数,要比在本地堆栈(内存)中取快很多。
UL
UL通用用在一个常数后面,标记为unsigned long。 使用UL的必要性在于告诉编译器,把这个常数作为长型数据对待。这可以避免在部分平台上,造成数据溢出。例如,在16位的整数可以表示的范围是-32768-32767;一个无符号整型表示的范围可以达到65536.使用UL可以帮助当你使用大数或长的位掩码时,写出的代码与平台无关。
Const和volatile
关键字const的含义不能理解为常量,而是理解为“只读”。
关键字volatile标记变量可以改变,而没有告警信息。Volatile告诉编译器每次访问时,该变量必须重新加载,而不是拷贝或缓存中读取。需要使用volatile的场合有,当我们处理中断寄存器时,或者并发进程之间的共享的变量。