将C联合转换为C ++联合

时间:2020-10-08 13:10:16

标签: c++ c

我正在尝试将一些用于嵌入式目标的旧式C代码迁移到C ++中以解决兼容性问题,而我在C ++中遇到一些工会问题。

在我们的项目中,我们采用以下联合形式来减少RAM使用量:

from PIL import Image
from io import BytesIO

i = Image.open(BytesIO(r.content))

这很好用,易于使用,并且编译器在编译时将位字段初始化为正确的值

然后在转换为C ++时

typedef union unionTest
{
    struct
    { uint32_t          nField1:5
    ; uint32_t          nField2:4
    ; uint32_t          nField3:23
    ;}
; uint32_t              nRaw                            ///< Raw data
;} unionTest;

// A global variable for configuration
unionTest myCUnion = {.nField1 = 1, .nField2 = 2, .nField3 = 3 };

不再工作,出现“初始化太多”错误。无论如何,要保持C行为。我知道ISO C ++禁止使用匿名结构,但是更改此结构会对代码库产生巨大影响,目前还不被认为很重要。

我还尝试了使用命名结构

typedef union unionTest
{
    struct
    { uint32_t          nField1:5
    ; uint32_t          nField2:4
    ; uint32_t          nField3:23
    ;}
; uint32_t              nRaw                            ///< Raw data
;} unionTest;

// Using const saves RAM, one of the reason to switch to C++
const unionTest myCppUnion = {.nField1 = 1, .nField2 = 2, .nField3 = 3 }; // Error

我找不到保持原始C行为的解决方案。

我尚未测试解决方案“ myCppUnion3”是否正确填充了位域,但是我对通过找到解决方案“ myCppUnion”的解决方案/解决方法更加感兴趣

如果任何人有任何线索,我都会乐意接受!!

2 个答案:

答案 0 :(得分:7)

在C ++中,您需要额外的花括号来反映初始化程序在子结构中:

const unionTest myCppUnion = { {.nField1 = 1, .nField2 = 2, .nField3 = 3 } };

答案 1 :(得分:3)

我出现“初始化器太多”错误。

解决方案很简单。您需要使用一组花括号来明确表示您正在初始化联合中的嵌套类:

for i in df_main['Nachname']:
    if i in df_third['Name']:
        print("true")
    else:
        print("false")

我知道ISO C ++禁止使用匿名结构

实际上,这是C ++必须修复的另一件事。修复该问题后,您可以像示例中那样为结构使用指定的初始化符号。

您可能会遇到的第三个问题是C ++不允许读取不活动的工会成员,这似乎就是您在C语言中所做的事情。

第四个潜在的问题是,如果您曾经切换过编译器,则可能会发现位域的顺序发生了变化,如果您的程序依赖于特定的顺序,那么这可能是个问题。