我已经读过struct in union initialize,但无法解决我的问题
在我的旧代码中,我有很多类似
的struct-with-uniontypedef struct st
{
union
{
struct
{
uint8 sign ;
uint8 cells;
}s;
int data;
}u;
int extra;
} st;
在C下,编译如下:
static const st someval = {
.sign = 0, .cells ={ 0 },
.cells = { 11 }
};
是否有一种方法可以最小化更改编译方法(或代码)以使其在g ++下进行编译?
答案 0 :(得分:5)
static const st someval = { .sign = 0, .cells ={ 0 }, // ^ .cells = { 11 } }; // ^
您两次初始化cells
,这会使它在C ++中格式错误。
此外,sign
和cell
都不是st
的直接成员。声明is ill formed in C as well。
以下将正确使用C ++ 20中的指定初始化程序(一种将来的C ++标准,建议将指定初始化程序引入该语言):
static const st someval = {
.u{.s{.sign = 0, .cells = 11}},
// NOTE .extra left zero-initialized
};
或以下,在C ++ 20和C中都是正确的:
static const st someval = {
.u = {.s = {.sign = 0, .cells = 11}},
};
但是,当前的C ++标准没有指定的初始化程序。您可以编写一个函数,该函数创建一个本地非常量零初始化st
对象,然后使用成员访问器初始化要初始化的特定成员,然后返回该对象。然后,可以通过调用该函数来初始化const st
对象。该初始化函数可能在其他任何地方都没有用,因此您可能要使用lambda以避免不必要地污染名称空间。
static const st someval = []() {
st o {};
o.u.s.sign = 0;
o.u.s.cells = 11;
return o;
}();