Gnu C的不同于标准C的语法

Posted on 2013-07-16 10:24  tongchuhuozhai  阅读(434)  评论(0编辑  收藏  举报

2. ,## 是与逗号合在一起用的, 表示后面有变量,则显示逗号,若后面无变量,则不显示逗号, 这种情况适用于用宏替换可变参数的函数,调用的时候可能传一个参数,或传两个参数, 这种打印语句在平台上,函数名字不一样, 如
#define pr_debug(fmt, arg...) printk(fmt,##arg), 如果没有,##这种语法, 这个宏定义就要变成如下:
#define pr_debug(fmt) printk(fmt)
#define pr_debug(fmt, arg) printk(fmt,arg)
所以,##使多个宏定义变成一条宏定义,使代码更精简。
调用时pr_debug("a"), 被替换成printk("a");
pr_debug("a %d", 1), 被替换成printk("a %d", 1);

宏函数中若有多个参数,必须有... 


3. 数组的整体赋值方式
n1...n2, 表示从n1到n2之间所历的索引
如int a[100] = {[0...99] = 0 };
表示对数组中100个元素全部赋值为0

4. 结构成员赋值
通过在大括号指定结构成员赋值,如
struct A a = {
.mem1 = 1;
};

5. __FUNCTION__代表其所在的函数的名字

6.函数, 结构体,变量的属性
结构体中的各成员变量对齐,是为了避免读一个成员变量用两条指令, 对于32位系统, 地址必须是32bit(即4字节)的整数倍。结构体若以4字节对齐,可在结构体定义结束处加上__attribute__((aligened(4))), 高通modem代码,则为PACKED的这种写法。
编译器在编译无返回会下的函数,会发出警告信息,可以在函数声明结束处加上 __attribute((noreturn)) 来优化编译,不产生警告信息。
若需要变量占最小的内存,可在变量声明的结束处加上 __attribute((packed))

7 内建函数
Gnu c库提供了与标准C库相对应的函数库,该函数库有诸如memcpy等函数,对于非函数的库中内建函数的名字要以__builtin__为前缀。

8. do {while(0)}
使函数以分号结束, 用于if之下。