我看到一些嵌入式系统固件书籍/文章建议不要使用 C 的结构位域,因为它不可移植。我知道顺序和填充是实现定义的,但是使用位域总是不可移植的吗?
我的意思是,例如,如果我为 8 位微控制器驱动程序定义了一个配置结构,如下所示:
typedef struct
{
int channel_name :3 ; /*7 possible channels*/
int Enable :1 ; /*if 1 enable,otherwise disable*/
int Mode;
} conf_t
Run Code Online (Sandbox Code Playgroud)
我不明白在这种情况下,实现定义的行为如何引发可移植性问题,谁能解释一下?
以下是一些可能发生的可移植性问题:
channel_name在 3 MSB 或 3 LSB 中分配?int大小为 1的位域时,不同编译器的不同行为。那个位是什么,符号位或数据?在位域中(并且仅在那里),编译器可以将int其视为有符号或无符号,并且在有符号的情况下,它们在符号位方面的行为可能有所不同。然后还有一堆其他定义不明确的事情,但不太可能在现实中引起实际问题。