嵌入式C语言基础知识一

📅 2026/8/11 2:12:21
嵌入式C语言基础知识一
一、预处理宏 #define 专题1. 宏基础特性#define本质纯文本替换编译预处理阶段执行不会做语法校验。宏函数特性空间换时间无函数调用栈开销缺点是运算符优先级容易出错。区分普通函数运行时调用宏在预处理阶段直接文本展开。2. 宏专用运算符 #、##单井号#字符串化将宏参数直接转为字符串字面量 示例代码c运行#define LOG_STR(X) printf(#X) // 调用 LOG_STR(test); 展开为 printf(test);双井号##标识符拼接拼接两段文本生成新变量 / 函数名 示例代码c运行#define DAY_DECLARE(X) int day##X #define DAY(X) day##X DAY_DECLARE(1); // 展开int day1 DAY(1) 20; // 展开day1 20;3. 安全宏固定模板 do {} while (0)c运行#define LOOP_OP(a,b) do { (a)(a)*(b); a; } while(0)作用宏在 if、for 分支后单独调用时保证代码块完整性规避语法错误。4. 工程调试可变参数打印宏c运行#define LOG_INFO(X, ...) printf(%s:%d: #X \r\n, __FUNCTION__, __LINE__, ##__VA_ARGS__)关键字说明__FUNCTION__系统内置宏代表当前函数名称__LINE__系统内置宏代表当前代码行号##__VA_ARGS__适配可变参数无额外参数时自动删除前置逗号。二、基础关键字与基础整型sizeof属于运算符 / 关键字不是函数编译阶段即可计算内存占用字节数。32 位 CPU 标准整型长度int4 字节32bitshort2 字节16bit三、结构体 struct嵌入式高频考点内存对齐1. 内存对齐底层原理CPU 为提升内存总线访问效率强制内存边界对齐保证单次总线周期完整读取成员减少内存读取次数。 普通结构体存在填充字节padding成员内存并非连续存储。2. 32 位系统对齐规则成员自身对齐变量起始地址必须是自身数据类型字节数的整数倍结构体整体对齐结构体总字节数 内部最大基础成员字节数的整数倍。 示例c运行struct abc{ char a; // 1字节 int b; // 4字节 }; // 内存布局a(0地址) 3字节填充 b(4~7地址)总大小8字节3. 取消对齐紧凑存储attribute((packed))适用场景串口通信数据包、Flash 存储协议帧消除填充字节节省空间。c运行struct __attribute__((packed)) DataMsg{ uint8_t cmd; uint16_t adc_data; };4. 结构体声明规则仅声明结构体类型、不定义变量时不会分配内存定义变量时可同步初始化struct abc test {1, 100};四、联合体 union1. 核心特性全部成员共享同一块内存所有成员起始地址完全一致联合体总内存大小 内部最大数据类型占用字节同一时间仅能有效存储一个成员写入新成员会覆盖原有数据。2. 三大工程使用场景节省内存MCU 资源有限时互斥变量共用同一片内存多视角解析数据同一内存可按整型、单字节分段读取判断计算机大小端模式嵌入式经典用法c运行union EndianTest{ uint16_t full_val; uint8_t split_byte[2]; }; // 赋值 full_val 0x0001; // split_byte[0]1 → 小端模式split_byte[1]1 → 大端模式3. 搭配用法联合体 紧凑结构体用于硬件寄存器解析、串口通信帧解析。五、枚举 enum内存底层存储默认基于 int4 字节常量数值超出 int 范围时编译器自动选用更大整型。数值赋值规则未手动赋值的成员从上至下默认依次 1手动赋值后后续无赋值成员在上一个常量数值基础上 1核心作用整型常量集合替代 “魔法数字”提升代码可读性多用于状态机、指令标志位。 示例c运行enum CollectState{ IDLE, // 默认0 START5, READ_DATA // 自动赋值6 };六、分类对比总结表表格数据类型内存分配特点工程核心用途普通 struct 结构体成员顺序存储存在填充对齐总大小≥所有成员字节和存储一组关联参数采集压力数据、设备配置packed 紧凑结构体无填充字节内存连续无对齐串口通信协议、Flash 存储数据包union 联合体所有成员共用一块内存大小端检测、寄存器 / 数据分段解析、低内存设备省空间enum 枚举常量集合底层 int 存储状态机、指令码、标志位消除魔法数字#define 宏预处理文本替换不占用运行内存常量定义、调试打印、简易批量逻辑