Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не могу понять как определяется union
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Aiva
В чужом проекте (Иаровском демо-проекте, если интересно), в файле заголовков определен такой себе тип:

Код
typedef struct _MADCTR_Data_t {
    union
    {
        Int8U MemDataAccCtrl;
        struct
        {
            Int8U          : 3;
            Int8U RGB : 1;
            Int8U ML  : 1;
            Int8U MV  : 1;
            Int8U MX  : 1;
            Int8U MY  : 1;
        };
    };    
} MADCTR_Data_t, *pMADCTR_Data_t;

Там работает и все Ок. Но я пытаюсь перенести кусок из этого проекта в другой. И тут в двух последних строчках вижу предупреждение вида:
Код
Worning[Pe040]: expected an identifier


Насколько я понимаю правила определения структур - предупреждение справедливое. Но тогда - почему его не было в исходном проекте ? И главное - как это предупреждение может аукнуться потом ?
SSerge
Цитата(Aiva @ Mar 21 2010, 04:43) *
В чужом проекте (Иаровском демо-проекте, если интересно), в файле заголовков определен такой себе тип:

Это одно из расширений IAR, анонимные структуры, по аналогии с анонимными объединениями.
Из EWAVR_CompilerReference.pdf:
"C++ includes a feature named anonymous unions. The AVR IAR C/C++ Compiler allow
a similar feature for both structs and unions.
An anonymous structure type (that is, one without a name) defines an unnamed object
(and not a type) whose members are promoted to the surrounding scope. External
anonymous structure types are allowed."

Если не пользоваться ни тем ни другим, то придётся объявлять структуру так:
Код
typedef struct _MADCTR_Data_t {
    union
    {
        Int8U MemDataAccCtrl;
        struct
        {
            Int8U          : 3;
            Int8U RGB : 1;
            Int8U ML  : 1;
            Int8U MV  : 1;
            Int8U MX  : 1;
            Int8U MY  : 1;
        } s;
    } u;    
} MADCTR_Data_t, *pMADCTR_Data_t;

и обращаться к полю MX вот таким образом: MADCTR_Data_t.u.s.MX
Использование анонимного union позволяет убрать .u , а IAR-овское расширение ещё и обойтись без .s
Если компилятор ругнулся два раза, то он, похоже, не поддерживает не только анонимных структур, но и объединений тоже.
Aiva
Цитата(SSerge @ Mar 21 2010, 03:48) *
Это одно из расширений IAR, анонимные структуры, по аналогии с анонимными объединениями.
...

Ухты! Очень похоже на правду, спасибо за ответ. Но, поскольку оба проекта компилятся в одном и том же ИАРе, видимо эта опция включается. Попробую поискать директивку.
(Точнее пытаются быть скомпилированы. Мой пока только пытается smile.gif)
Сергей Борщ
Цитата(Aiva @ Mar 21 2010, 07:27) *
Но, поскольку оба проекта компилятся в одном и том же ИАРе, видимо эта опция включается.
В настройках компилятора ищите "Allow IAR extensions"
Aiva
Цитата(Сергей Борщ @ Mar 21 2010, 13:16) *
В настройках компилятора ищите "Allow IAR extensions"

Точно, нашел, спасибо.
Herz
Цитата(Aiva @ Mar 21 2010, 00:43) *
Там работает и все Ок. Но я пытаюсь перенести кусок из этого проекта в другой. И тут в двух последних строчках вижу предупреждение вида:
Код
Worning[Pe040]: expected an identifier

Хе. Так прям и предупреждает: "Worning"? biggrin.gif
Make_Pic
Цитата(Herz @ Mar 21 2010, 18:37) *
Хе. Так прям и предупреждает: "Worning"? biggrin.gif

Думаю многие из нас именно такое предупреждение должны были получить sm.gif)) Но это off здесь...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.