static const st someval = {
.sign = 0, .cells ={ 0 },
// ^
.cells = { 11 } };
// ^
Вы инициализируете cells
дважды, что делает его некорректным в C ++.
Кроме того, ни sign
, ни cell
не являются прямыми членами st
.Объявление также плохо сформировано в C .
Следующее будет правильным использованием обозначенных инициализаторов в 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
с помощью вызова этой функции.Эта функция инициализации может оказаться бесполезной где-либо еще, поэтому вы можете использовать лямбду, чтобы избежать ненужного загрязнения пространства имен .:
static const st someval = []() {
st o {};
o.u.s.sign = 0;
o.u.s.cells = 11;
return o;
}();