объединение внутри структуры - как сделать назначенный инициализатор? - PullRequest
0 голосов
/ 16 ноября 2018

Я уже прочитал struct in union initialize , и это не решает мою проблему

В моем устаревшем коде у меня есть тонны struct-with-union, например

typedef 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 ++?

1 Ответ

0 голосов
/ 16 ноября 2018
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;
}();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...