我有一个 uint64 变量,通常只需要高位或低位 32 位访问。我正在使用 32 位 ARM Cortex M0,为了提高速度,我尝试将 uint64 变量与 C 中的两个 uint32 变量重叠,使用匿名结构,希望避免指针运算来访问成员。
我想做的事情可能吗?使用命名联合可能同样快,但现在我只是好奇是否可以不使用命名联合。以下情况未编译成功:
http://goo.gl/ejx37y
#include <stdint.h>
volatile union {
uint64_t ab;
struct { uint32_t a, b; };
};
int main(void)
{
a = 1;
};
您定义一个没有实例的联合,这意味着不存在包含成员的联合对象。你可能可以这样做:
main.h:
typedef union {
uint64_t ab;
struct { uint32_t a, b; };
} u_t;
extern u_t u;
main.c:
u_t u = { .a = 1; };
如果你真的想(在 main.h 中):
#define a u.a
#define b u.b
#define ab u.ab
如果你使用#define
s,小心它们影响any标识符(a、b、ab)的声明/使用,即使是在不同范围内的标识符。我建议您只需通过以下方式显式访问这些值u
对象(如u.a
, u.b
, u.ab
).
我已经删除了volatile
从声明中,因为我非常怀疑你真的需要它。但如果您愿意,您当然可以将其添加回来。
(注意:问题最初将代码拆分为两个文件,main.h 和 main.c。我的答案相应地包含两个文件的代码。但是,这些可以轻松合并为一个)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)