gpt4 book ai didi

c++ - 用 union 初始化 C++ 结构的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-03 06:54:28 25 4
gpt4 key购买 nike

MISRA-C++ 规则 8-5-2 要求使用正确的大括号初始化 C++ 结构。我有一个带 union 的结构,我无法找到满足此规则的正确大括号组合。我不确定我的代码是否不正确或来自静态代码分析器工具的误报警告。

这是结构:

typedef struct XMC_VADC_RESULT_CONFIG
{
union
{
struct
{
uint32_t : 16;
uint32_t data_reduction_control : 4; /**< Configures the data reduction stages */
uint32_t post_processing_mode : 2; /**< Result data processing mode. Uses @ref XMC_VADC_DMM_t
For normal operation select
XMC_VADC_DMM_t::XMC_VADC_DMM_REDUCTION_MODE
and data_reduction_control as 0*/
uint32_t : 2;
uint32_t wait_for_read_mode : 1; /**< Allow the conversion only after previous results are read*/
uint32_t part_of_fifo : 2; /**< Make the result register a part of Result FIFO? */
uint32_t : 4;
uint32_t event_gen_enable : 1; /**< Generates an event on availability of new result. */
};
uint32_t g_rcr;
};
} XMC_VADC_RESULT_CONFIG_t;

这是我的初始化代码:

    const XMC_VADC_RESULT_CONFIG_t resultConfig = 
{
{
{
.data_reduction_control = 0U, // No Accumulation
.post_processing_mode = static_cast<uint32_t>(XMC_VADC_DMM_REDUCTION_MODE),
.wait_for_read_mode = 0U, // Disabled
.part_of_fifo = 0U, // No FIFO
.event_gen_enable = 0U // Disable Result event
}
}
};

我也试过摘掉一副牙套,但没用。正确的牙套数量是多少?

最佳答案

  • 正确、合规的大括号放置方式为 const XMC_VADC_RESULT_CONFIG_t resultConfig = { 0u };
  • MISRA-C++ 需要 C++03,因此您不能使用其他任何东西。
  • 指定的初始值设定项(.name 语法)是一种 C 语言,仅存在于 C99 及以后的版本中。它们在 MISRA-C:2004 中是不允许的,但在 MISRA-C:2012 中(有一些特殊规则)。在 C++ 中,它们最近才被引入,在一个不允许在 MISRA 兼容应用程序中使用的 C++ 版本中。
  • union 类型双关通常在任何 MISRA 中都不允许,尤其是在 C++ 中,这是未定义的行为。 C 中存在该规则的一些异常(exception),但 C++ 中没有。
  • 位域在任何关键应用程序中的存在,无论是否为 MISRA,都是非常值得怀疑的做法,因为它们的标准化程度很低。

总结:您不能在任何形式的 MISRA 应用程序中使用此代码。删除 union 和位域,并用按位运算符和位掩码替换它们。

关于c++ - 用 union 初始化 C++ 结构的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64114113/

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