C扩展

一 C99的扩展

1.1 复合字面量:参考《C语言复合字面量应该如何使用》《嵌入式工程师必学:GCC 扩展语法

字面量是指除符号常量外的常量,char/int/float作为函数形参可以是变量也可以是const修饰的常量,但若是对应的数组,只能传变量而不能常量,因此引入复合字面量。 如int* pt1=(int [2]){19,20};也即带初始化值的匿名数组,结构体和枚举也可以用复合字面量。用途:函数实参,二维或多维数组。

C和C++中复合字面量的不同:在C中,复合字面量表示具有静态或自动存储持续时间的未命名对象;在C++中,复合字面量表示一个临时对象,该对象仅在其完整表达式结束之前一直存在。

1.2  属性扩展:

__attribute__((interrupt)):中断ISR函数加此修饰可让编译器生成自动现场保护和恢复的代码避免手动来写。

#define DRIVER_INIT_SEC __attribute__((section(".driver.init")))    然后所有的硬件初始化函数用DRIVER_INIT_SEC修饰后,可以用for循环进行集中初始化。

1.3 结构体对齐

__attribute__((packed))、

1.4 typeof(type):避免#define MAX_OLD(a, b) ((a) > (b) ? (a) : (b))   MAX_OLD(a++, b++) 错误。即

#define MAX_SAFE(a, b) ({ \
    typeof(a) _a = (a); \
    typeof(b) _b = (b); \
    _a > _b ? _a : _b; \
})

1.5内建函数:由编译器直接翻译成高效指令(而非调用库函数),既能提升性能,又能解决标准 C 难以处理的场景 —— 比如原子操作、分支优化、硬件位运算等。

posted on 2025-10-13 11:19  杰瑞鼠  阅读(7)  评论(0)    收藏  举报