如何编写C语言宏重排位域结构体复合初始化器,省略成员指定符
答案
这个需求完全可以实现,通过C语言宏定义即可达到你要的效果。
前置说明
需要先确认你所用开发环境的位域布局规则:C语言标准没有强制规定位域的分配顺序(是从整数的低位往高位排还是高位往低位排),不同编译器、不同架构的实现存在差异。你当前的struct myBits定义是b00在前、b31在后,需要先测试确认在你的编译环境下,b00确实对应32位整数的最低位,b31对应最高位,避免赋值顺序错误。
宏实现代码
因为你用的是固定32位的寄存器,直接写固定32参数的宏即可,逻辑简单可读性高,编译器也能帮你检查参数数量是否匹配:
// 参数顺序:第1个参数对应B31的值,第2个对应B30,依此类推,第32个对应B00的值 #define BITS_FROM_B31(v1,v2,v3,v4,v5,v6,v7,v8, \ v9,v10,v11,v12,v13,v14,v15,v16, \ v17,v18,v19,v20,v21,v22,v23,v24, \ v25,v26,v27,v28,v29,v30,v31,v32) \ { \ .b31 = (v1), .b30 = (v2), .b29 = (v3), .b28 = (v4), .b27 = (v5), .b26 = (v6), .b25 = (v7), .b24 = (v8), \ .b23 = (v9), .b22 = (v10), .b21 = (v11), .b20 = (v12), .b19 = (v13), .b18 = (v14), .b17 = (v15), .b16 = (v16), \ .b15 = (v17), .b14 = (v18), .b13 = (v19), .b12 = (v20), .b11 = (v21), .b10 = (v22), .b09 = (v23), .b08 = (v24), \ .b07 = (v25), .b06 = (v26), .b05 = (v27), .b04 = (v28), .b03 = (v29), .b02 = (v30), .b01 = (v31), .b00 = (v32) \ }
使用示例
按照你给出的预期场景,使用方法如下:
// PIOB-> offset: PIO_CODR // 0x400E1000U 0x00000034U (*(volatile uint32_t*)0x400E1034U) = *(uint32_t*)&(struct myBits) BITS_FROM_B31( // -------------------------------------------------------------------------------------------------- /*| B31 | B30 | B29 | B28 | B27 | B26 | B25 | B24 |*/ 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , // -------------------------------------------------------------------------------------------------- /*| B23 | B22 | B21 | B20 | B19 | B18 | B17 | B16 |*/ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // -------------------------------------------------------------------------------------------------- /*| B15 | B14 | B13 | B12 | B11 | B10 | B09 | B08 |*/ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // -------------------------------------------------------------------------------------------------- /*| B07 | B06 | B05 | B04 | B03 | B02 | B01 | B00 |*/ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
其他说明
- 宏的每个参数都加了括号,避免传入带运算符的表达式时出现优先级错误,兼容性更强。
- 如果你需要适配不同位宽的寄存器,也可以基于可变参数宏加参数反转逻辑实现通用版本,但固定参数的宏在嵌入式场景下更稳妥,参数数量不对会直接触发编译报错,不会出现运行时异常。
内容的提问来源于stack exchange,提问作者Juan Manuel López Manzano
相关产品推荐
相关产品推荐

