【发布时间】:2020-09-29 06:34:21
【问题描述】:
MISRA-C++ 规则 8-5-2 要求使用正确的大括号初始化 C++ 结构。 我有一个带有联合的结构,但我找不到正确的大括号组合来满足这个规则。我不确定我的代码是错误的还是来自静态代码分析器工具的误报警告。
这是结构:
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
}
}
};
我也试过移除一组牙套,但没有帮助。 大括号的正确数量是多少?
【问题讨论】:
-
请注意,MISRA C++:2008 的第 9-5-1 条规定根本不应使用联合(“(必需)不应使用联合.");所以请注意,如果您想继续使用联合,则需要正式偏离此规则。
-
是的,我已经看到了。我的问题是结构定义在微控制器制造商提供的库中。我必须使用这个库。在这种情况下,使用联合来访问整个寄存器或单个位也是有意义的。
-
我认为 MISRA 禁止联合,因为在 C++ 中通过联合进行类型双关语通常是未定义的行为
-
@amanning 该库很可能假定非 MISRA C。不是 MISRA-C++。为什么必须使用 C++?它不是声明寄存器映射的合适语言。
-
库是C,但是我们的应用是C++,所以初始化是C++。