我目前正在开发嵌入式代码端口(在飞思卡尔S12上),所以GNU和我遇到了工会的问题。我有下面的工会
typedef signed short sint16;
typedef signed long sint32;
typedef union
{
sint32 Akku;
sint16 AkkuHigh;
sint16 AkkuLow;
} akku_type;
我想要访问联盟中最高的2字节。问题是,AkkuHigh和AkkuLow都有着与Akku相同的起始位置。它似乎是特定于编译器的。我的问题是:有没有改变工会行为的编译器旗帜?atribute((align (2)能帮我吗?
先谢谢你
发布于 2014-12-03 17:44:38
是的,所有的Akku
,AkkuHigh
,AkkuLow
都有相同的地址。这就是工会在C中的工作方式,根据它的外观,您打算与一个32位成员和一个由两个16位成员组成的成员组成一个联盟。你写的不是实现它的方法。试一试:
typedef union
{
sint32 Akku;
struct s {
sint16 AkkuHigh;
sint16 AkkuLow;
} representation;
} akku_type;
发布于 2014-12-03 17:51:21
联合的正确定义可以在这个答案中找到。
如果您在32位或64位架构上编译,atribute(align(2))
肯定会对您有所帮助。此外,在64位sizeof(sint32)
上是8
(64位)。
根据体系结构的终结性,您可能需要交换AkkuHigh
和AkkuLow
。
https://stackoverflow.com/questions/27278177
复制相似问题