Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将C结合转换为C++结合 我试图将一些嵌入的目标C代码移植到C++中,以解决兼容性问题,而我在C++中遇到了一些问题。_C++_C - Fatal编程技术网

将C结合转换为C++结合 我试图将一些嵌入的目标C代码移植到C++中,以解决兼容性问题,而我在C++中遇到了一些问题。

将C结合转换为C++结合 我试图将一些嵌入的目标C代码移植到C++中,以解决兼容性问题,而我在C++中遇到了一些问题。,c++,c,C++,C,在我们的项目中,我们采用以下联合方式来减少RAM使用量: typedef union unionTest { struct { uint32_t nField1:5 ; uint32_t nField2:4 ; uint32_t nField3:23 ;} ; uint32_t nRaw ///< Raw data ;

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

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时++

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行为的方法。我知道匿名结构是被ISO C++禁止的,但是改变它对代码库有很大的影响,而且目前还没有被判定为重要。 我还尝试了一个命名结构

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

// Using const saves RAM, one of the reason to switch to C++
const unionTest myCppUnion2 = {.notAnonymous.nField1 = 1, .notAnonymous.nField2 = 2, .notAnonymous.nField3 = 3 }; // expected primary-expression before '.' error
const unionTest myCppUnion3 = { .notAnonymous = { .nField1 = 1, .nField2 = 2, .nField3 = 3 } }; // Compiles
我找不到一个保持原来C行为的解决方案

我还没有测试解决方案MyCpUnion3是否正确填充了位字段,但我更感兴趣的是为解决方案MyCpUnion找到一个解决方案/解决方案


如果有人有任何线索,我很乐意接受
const unionTest myCppUnion = { {.nField1 = 1, .nField2 = 2, .nField3 = 3 } };

<>在C++中,你需要一组额外的括号来反映初始化器处于子结构:

const unionTest myCppUnion = { {.nField1 = 1, .nField2 = 2, .nField3 = 3 } };
我有太多的初始化错误

解决这个问题的办法很简单。您需要一组大括号来明确表示您正在初始化联合中的嵌套类:

{ // the union
    { // the struct
        .nField1 = 1, // members of the struct
        .nField2 = 2,
        .nField3 = 3,
    }
};
我知道ISO C禁止匿名结构++

确实,这是C++必须另一个必须解决的问题。修复了这个问题后,您可以像示例中那样为结构使用指定的初始化器

<>你可能会遇到的第三个问题是C++不允许从不活动的联合成员中读取,这可能是你在C.</P>中所做的事情。 第四个潜在问题是,如果您切换编译器,您可能会发现位字段的顺序发生变化,如果您的程序依赖于特定的顺序,这可能是一个问题

我有太多的初始化错误

解决这个问题的办法很简单。您需要一组大括号来明确表示您正在初始化联合中的嵌套类:

{ // the union
    { // the struct
        .nField1 = 1, // members of the struct
        .nField2 = 2,
        .nField3 = 3,
    }
};
我知道ISO C禁止匿名结构++

确实,这是C++必须另一个必须解决的问题。修复了这个问题后,您可以像示例中那样为结构使用指定的初始化器

<>你可能会遇到的第三个问题是C++不允许从不活动的联合成员中读取,这可能是你在C.</P>中所做的事情。

第四个潜在问题是,如果你切换编译器,你可能会发现,如果你的程序依赖于特定的顺序,那么你的位场的顺序可能会变的有问题。

fWW,使用C++中的这种联盟是未定义的行为。C++不通过一个联合来做类型的双关操作。使用const保存RAM,切换到C++的原因之一是如何使用const一个理由来切换到C++……这是原因之一,据我所知,它允许在ROM中存储一些变量而不是RAM和其他可能的。我没有做出这个决定,所以我可能误解了你需要使用C++ 2x来使用指定的初始化器。对于可读代码的喜爱,请把这些分号放在世界上其他地方的地方——在每一行的末尾。FWIW,使用C++中的这种联盟是未定义的行为。C++不通过一个联合来做类型的双关操作。使用const保存RAM,切换到C++的原因之一是如何使用const一个理由来切换到C++……这是原因之一,据我所知,它允许在ROM中存储一些变量而不是RAM和其他可能的。我没有做出这个决定,所以我可能误解了。我认为您需要使用C++2x来使用指定的初始值设定项。出于对可读代码的热爱,请将这些分号放在世界上其他人放置它们的位置—每行的末尾。感谢您的澄清!事实上,顺序非常重要,因为我们在读取硬件中的特定位时也使用类似的方法registers@BaptisteCC和C++都不保证位场的顺序。将整数分解为位的便携式方法是使用移位和掩码。感谢您的澄清!事实上,顺序非常重要,因为我们在读取硬件中的特定位时也使用类似的方法registers@BaptisteCC和C++都不保证位场的顺序。将整数分解为位的一种简便方法是使用移位和掩码。