我有一个包含位字段数组的嵌套数据结构,我需要使用 SDCC 为 MCS-51 目标编译这些位字段。
这是一个简化的例子:
example.c
struct data {
unsigned char a : 1;
unsigned char b : 2;
};
struct data dummy[8];
void main()
{
}
由于struct data
包含 3 位,8 个实例总共包含 24 位,因此 3 字节的内存足以存储它们。
但是 SDCC 分配了 8 个字节,我们可以在结果中看到example.asm
:
$ sdcc -c example.c
$ cat example.asm
[…]
; File Created by SDCC : free open source ANSI-C Compiler
; Version 3.5.0 #9253 (Mar 19 2016) (Linux)
[…]
.module example
.optsdcc -mmcs51 --model-small
[…]
.area DSEG (DATA)
_dummy::
.ds 8
有没有办法让 SDCC 只分配 3 个字节dummy
?
作为一种解决方法,我目前根本不使用 a struct
,而是使用一些宏来计算数据结构的总大小,分配一个平面字节数组,并生成索引和位掩码以访问各个成员。我想改用类似的语法dummy[5].b
。
一些编译器似乎有启用位域打包的选项(如#pragma pack
),但我在 SDCC 手册中没有找到类似的内容。