gpt4 book ai didi

c++ - 使用已定义的结构作为 union 的匿名成员

转载 作者:行者123 更新时间:2023-11-27 23:39:32 25 4
gpt4 key购买 nike

假设我有一个 32 位硬件寄存器 Reg,我希望能够以 32 位值(例如 Reg = 0x12345678)或作为位域(例如 Reg.lsw = 0xABCD)。我可以通过声明一个具有匿名结构成员的 union ,并声明赋值和转换运算符到/从 uint32_t 来实现这一点。在小端环境中,代码可能如下所示:

#include <cstdint>
#include <cstdio>

typedef union
{
uint32_t val ;
struct
{
uint32_t lsw : 16 ;
uint32_t msw : 16 ;
} ;

operator = (uint32_t n) { val = n ; }
operator uint32_t() const { return val ; }
} HWR ;

int main()
{
HWR Reg ;
Reg = 0x12345678 ;
Reg.lsw = 0xABCD ;
printf ("%X\n", uint32_t(Reg)) ;
}

但是现在假设我有一大堆这样的寄存器,每个寄存器都有自己的位域布局,并且我有一个头文件 FieldDefs.h 将这些位域布局声明为命名结构。我如何在上面的代码中使用这些命名结构,以便我可以访问 32 位值以及各个位域?我可以这样做:

#include "FieldDefs.h" // Defines struct MyHWR
typedef union
{
uint32_t val ;
struct MyHWR field ;

operator = (uint32_t n) { val = n ; }
operator uint32_t() const { return val ; }
} MyHWRUnion ;

但现在我需要键入 Reg.field.lsw =... 而不是 Reg.lsw =...

有没有办法(在 C++17 中)将一个已定义的结构声明为 union 的匿名成员?如果重要的话,我正在使用 g++ 7.3.0 版。

最佳答案

union
{
// ...
struct
{
// ...
};

这是一个匿名结构。匿名结构在 C++ 中是病式的。只有 union 可以是匿名的。这不同于允许匿名结构的 C(自 C11 起)。

Is there any way (in C++17) to declare an already defined struct as an anonymous member of a union?

没有。未命名的成员不能有命名类型。

您需要在未命名成员和预先声明的类之间做出选择。鉴于匿名结构首先是非标准的,我建议使用命名成员和预定义类。也许给它一个简短的名称以尽量减少冗长。

关于c++ - 使用已定义的结构作为 union 的匿名成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56426905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com