GNU C

来源:互联网 发布:金十数据图 编辑:程序博客网 时间:2024/05/16 14:59

笔记:来自宋宝华老师 Linux设备驱动开发详解(第二版)

1、打印当前函数名

GNU C 预定义了两个标志符保存当前函数的名字,_  _FUNCTION_  _保存函数在源码中的名
字,_ _PRETTY_FUNCTION_ _保存带语言特色的名字。在 C 函数中,这两个名字是相同的。

代码中的_ _FUNCTION_ _意味着字符串“example” 。C99 已经支持_ _func_ _宏,因此建议在
Linux 编程中不再使用_ _FUNCTION_ _,而转而使用_ _func_ _:

#include <stdio.h>void example(void) {    printf("This is function:%s", __func__); }  int main(int argc, char*argv[]) {    example();    return 0;}

输出 This is function:example

 2、宏扩展

前加##或后加##,将标记作为一个合法的标识符的一部分.

注意,不是字符串.多用于多行的宏定义中.例如:

 #define A(x)  T_##x
则 int A(1) = 10; //等效于int T_1 = 10;
#define A(x)  Tx##__
则 int A(1) = 10; //等效于int T1__ = 10;

 3、特殊属性声明
GNU C 允许声明函数、变量和类型的特殊属性,以便进行手工的代码优化和定制代码检查的
方法。要指定一个声明的属性,只需要在声明后添加_ _attribute_ _  (( ATTRIBUTE ))。其中

ATTRIBUTE为属性说明,如果存在多个属性,则以逗号分隔。GNU C支持noreturn、format、section、
aligned、packed 等十多个属性。
noreturn 属性作用于函数,表示该函数从不返回。这会让编译器优化代码,并消除不必要的
警告信息。例如:
# define ATTRIB_NORET  _ _attribute_ _((noreturn)) ....
asmlinkage NORET_TYPE void do_exit(long error_code) ATTRIB_NORET;

 

aligned 属性用于变量、结构体或联合体,指定变量、结构体或联合体的对界方式,以字节为
单位,例如:

struct example_struct {  char a;  int b;  long c; } __attribute__((aligned(4)));         
表示该结构类型的变量以 4 字节对界。
packed 属性作用于变量和类型,用于变量或结构体成员时表示使用最小可能的对界,用于枚
举、结构体或联合体类型时表示该类型使用最小的内存。例如:

struct example_struct {
    char a;
    int b;
    long c ;

}__attribute__((packed)); 

 
编译器对结构体成员及变量对界的目的是为了更快地访问结构体成员及变量占据的内存。

例如:对于一个32位的整型变量,若以4字节存放,则cpu在一个总线周期内就可以读取32位;

否则cpu需要两次总线周期才能组合一个32位整型