|
Анонимные структуры IAR vs Keil |
|
|
|
Jun 4 2016, 10:24
|
Частый гость
 
Группа: Участник
Сообщений: 102
Регистрация: 23-02-09
Пользователь №: 45 242

|
-Приветствую, есть проект на "Сях в ИАР-е , в нем плотно используются структуры с "автоопределением" типа: Код static union {struct { сhar bit_1 : 1; char bit_2 : 1; char bit_3 : 1; char bit_4 : 1; char bit_5 : 1; char bit_6 : 1; char bit_7 : 1; char bit_8 : 1; } ; char byte; }; И с использованием членов как: bit_2 =1; или byte=5;Возникла необходимость перетянуть прогу на Кеил, и тут наткнулся на неприятную вещь, как невозможность использовать вышеуказанное непосредственно , при попытке использовать команду препроцессора #pragma anon_unions компилятор пропускает лишь объявление\определение, с предупреждением, но при попытке обратиться к члену дает ошибку... Может у кого-то будут идеи как минимальными затратами исправить ситуацию, уж больно не хочется перелопачивать всё )
|
|
|
|
|
 |
Ответов
|
Jun 7 2016, 19:09
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
А каким образом решается конфликт объявления нескольких разных анонимных структур или юнионов с одинаковыми названиями членов на том же уровне иерархии (локальном/глобальном)? Что там говорит стандарт о вложениях анонимных структур/юнионов? Все анонимные вложения тоже считаются одним уровнем области видимости, на котором запрещены одинаковые имена? Или запрет наложения имён только на том же уровне (не заходя в анонимные структуры), а поиск при компиляции будет вниз по иерархии (по анонимам) до первого встречного совпадающего имени? В последнем случае зарыта грабля. Логично, конечно, если при создании структуры правила поиска будут ближе к разбору исполняемого кода. Но т.к. факт анонимности структуры обнаруживается после создания компилятором её (анонимного) типа, то все проверки имён будут после. Проблема видится в том, что имена членов при этом не должны совпадать ни с какими именованными объектами, которые нельзя замещать на текущем уровне (локальном/глобальном). Это усложняет логику компилятора. Хотелось бы знать - ради чего. Цитата(dimone @ Jun 5 2016, 22:37)  Цитата(jcxz) Сделать структуру именованной, а потом при помощи define задать для старого имени из исходников эквивалент имени члена новой структуры. -cамое простое и логичное решение, в моеи ситуации, как сразу не допер.. Там разве не все члены придётся "задефайнивать"? Ведь <старые имена> это все члены структуры. Цитата(zltigo) неименованные структуры безмерно полезны. Когда приходится изредка описывать, например, протоколы под убогие компиляторы, то заморочки вылезют немалые, БЕЗ возможности описания таких структур. Можно пример? В чём полезность? Как в С99 или другом стандарте безымянная структура объявленная в одном модуле видна другому модулю? Члены/поля структур передаются через хидеры с typedef. А безымянную структуру-переменную вроде как нельзя объявить через typedef. Даже просто указатель на неё не передать в код из другого модуля. Пока наблюдается только полная невидимость глобальной структуры/юниона-переменной извне модуля. А внутри модуля переменная такая, которая в памяти есть, но её адрес получить нельзя. Адрес первого элемента/члена это не то же самое. Но размер узнать можно, если при объявлении было указано предворяющее имя. ЗЫ. Термин модуль здесь в Паскаль-терминологии. Если в Си он что-то другое/большее значит. -------- Кажется можно объявить анонимную структуру-переменную с предворяющим именем, и этот созданный тип перенести в typedef и задать ему имя, которое можно будет использовать в type-cast. Но полученное type-object-name будет только для текущего модуля, т.к. оно создаётся после создания переменной.
Сообщение отредактировал GetSmart - Jun 8 2016, 12:43
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jun 7 2016, 21:18
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(GetSmart @ Jun 7 2016, 22:09)  А каким образом решается конфликт объявления нескольких разных анонимных структур или юнионов с одинаковыми названиями членов на том же уровне иерархии (локальном/глобальном)?
Можно пример? Если это о сборке нескольких в один проект, то придётся следить чтобы имена членов у разных протоколов никогда не совпали. Если совпадут, то кирдык компиляции. Править протоколы, точнее множество имён, под свою сборку - плохая идея. Гораздо проще править одно имя - имя структуры. Компилятор сам именует всё не именованное (анонимное) своими внутренними уникальными именами, поэтому никаких конфликтов нет. Если посмотреть листинги и мар-файл, там все эти имена видны. Так что просто компилятор сам делает часть рутинной работы по именам, и эти имена просто скрыты, поскольку программисту не нужны. Чаще всего удобно не именовать вложенные структуры, при этом значительно уменьшается длина имени конечного сильно вложенного члена. Саму внешнюю структуру можно тоже делать анонимной, но при этом как раз и могут возникнуть проблемы, которые вы описали. Поэтому внешнюю структуру лучше именовать. Вот пример для ИАР-а MSP430: Код typedef struct { union { unsigned short StatAll; struct { unsigned char Status; struct { unsigned char Mode :2; unsigned char Dir :1; }; }; }; struct { unsigned char fZeroHold :1; unsigned char :7; }; unsigned char CurrentLimit unsigned int AccelStart; unsigned int AccelBrake; ... signed long MaxPosition; } motor_vars_t;
motor_vars_t Motor; Именованны только члены вложенных структур, сами внутренние структуры анонимны.
|
|
|
|
|
Jun 7 2016, 21:45
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(Baser @ Jun 8 2016, 01:18)  Компилятор сам именует всё не именованное (анонимное) своими внутренними уникальными именами, поэтому никаких конфликтов нет. Если посмотреть листинги и мар-файл, там все эти имена видны. А причём тут это? При разборе текста кода этих имён в тексте не должно быть и если даже писатель кода туда вставит имя из MAP-файла, то компилятору надо заругаться. Если "уникальные имена" становятся видимы постфактум, то как их предугадывать? )) Плюс это уже далеко от стандарта. ---------- Вообще, если в стандарте написано, что доступ к члену структуры/юниона происходит через оператор точка или ->, и явно не указано, что есть другой способ, то анонимная compound-переменная (ака структура/юнион) не разрешена. Операторы точка и -> бинарные. Внутри объявления compound-константы связь с типом есть неявно, без необходимости использовать имя. То бишь есть смысл/удобство его опускать в тексте и для сокращения текста и для анонимного варианта. И ещё здесь между объявлением анонимного compound-типа (вместе с переменной) и доступом к члену нет возможностей локального замещения имён. Но, признаюсь, в реале мне никогда не надобились такие анонимы и не проверял создание таких переменных и констант ни на каком компиляторе.
Сообщение отредактировал GetSmart - Jun 8 2016, 11:40
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jun 8 2016, 09:16
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(GetSmart @ Jun 8 2016, 00:45)  А причём тут это? При разборе текста кода этих имён в тексте не должно быть и если даже писатель кода туда вставит имя из MAP-файла, то компилятору надо заругаться. Если "уникальные имена" становятся видимы постфактум, то как их предугадывать? )) Плюс это уже далеко от стандарта.
---------- Вообще, если в стандарте написано, что доступ к члену структуры/юниона происходит через оператор точка или ->, и явно не указано, что есть другой способ, то анонимная compound-переменная (ака структура/юнион) не разрешена. Операторы точка и -> бинарные. Внутри объявления compound-константы связь с типом есть неявно, без необходимости использовать имя. То бишь есть смысл/удобство его опускать в тексте и для сокращения текста и для анонимного варианта. И ещё между объявлением анонимного compound-типа (вместе с переменной) и доступом к члену нет возможностей локального замещения имён. Но, признаюсь, в реале мне никогда не надобились такие анонимы и не проверял создание таких переменных и констант ни на каком компиляторе. Вообще то это стандартное свойство C++ и оно очень удобно. Для чего нужно - пример выше я привел. Доступ к члену вложенной структуры короче: Motor.Mode; Иначе пришлось бы писать: Motor.Aaa.Bbb.Ccc.Mode; Что никакого практического смысла для алгоритма не имеет, только загромождает текст. Вот, чтобы не рыться, глава из руководства на IAR MSP430: Код ANONYMOUS STRUCTS AND UNIONS When a structure or union is declared without a name, it becomes anonymous. The effect is that its members will only be seen in the surrounding scope. Anonymous structures are part of the C++ language; however, they are not part of the C standard. In the IAR C/C++ Compiler for MSP430 they can be used in C if language extensions are enabled.
Example In this example, the members in the anonymous union can be accessed, in function f, without explicitly specifying the union name:
struct S { char mTag; union { long mL; float mF; }; } St;
void F(void) { St.mL = 5; }
The member names must be unique in the surrounding scope. Having an anonymous struct or union at file scope, as a global, external, or static variable is also allowed. This could for instance be used for declaring I/O registers, as in this example:
__no_init volatile union { unsigned char IOPORT; struct { unsigned char Way: 1; unsigned char Out: 1; }; } @ 8;
/* Here the variables are used*/
void Test(void) { IOPORT = 0; Way = 1; Out = 1; }
This declares an I/O register byte IOPORT at address 0. The I/O register has 2 bits declared, Way and Out. Note that both the inner structure and the outer union are anonymous. Anonymous structures and unions are implemented in terms of objects named after the first field, with a prefix _A_ to place the name in the implementation part of the namespace. In this example, the anonymous union will be implemented through an object named _A_IOPORT.
|
|
|
|
Сообщений в этой теме
dimone Анонимные структуры IAR vs Keil Jun 4 2016, 10:24 demiurg_spb Цитата(dimone @ Jun 4 2016, 13:24) Уши бы... Jun 4 2016, 18:21 DASM Цитата(dimone @ Jun 4 2016, 13:24) Уши бы... Jun 5 2016, 01:38 zltigo QUOTE (demiurg_spb @ Jun 4 2016, 21:21) К... Jun 5 2016, 02:36  DASM Цитата(zltigo @ Jun 5 2016, 05:36) Может ... Jun 5 2016, 02:46   demiurg_spb Цитата(DASM @ Jun 5 2016, 05:46) Зачем ут... Jun 5 2016, 20:14 dimone Цитата(dimone @ Jun 4 2016, 13:24) Уши бы... Jun 5 2016, 06:46 DASM Во-во.
Кстати, а какую ошибку он выдает? Jun 5 2016, 06:57 dimone при объявлении:
warning: #64-D: declaration does... Jun 5 2016, 06:59 DASM Да, вижу, попробовал.
Почитал тут срач https://rsd... Jun 5 2016, 07:09 dimone Цитата(DASM @ Jun 5 2016, 10:09) ..- охот... Jun 5 2016, 07:24 zltigo QUOTE (DASM @ Jun 5 2016, 10:09) Почитал ... Jun 6 2016, 15:38  DASM Цитата(zltigo @ Jun 6 2016, 18:38) Никаке... Jun 7 2016, 11:16   zltigo QUOTE (DASM @ Jun 7 2016, 14:16) Речь не ... Jun 7 2016, 16:02 ViKo Сделать структуру именованной, а потом заменить од... Jun 5 2016, 07:49 jcxz Сделать структуру именованной, а потом при помощи ... Jun 5 2016, 17:23  dimone Цитата(jcxz @ Jun 5 2016, 20:23) Сделать ... Jun 5 2016, 18:37    GetSmart Цитата(Baser @ Jun 8 2016, 13:16) Вообще ... Jun 8 2016, 11:09 jcxz Цитата(GetSmart @ Jun 8 2016, 01:09) -cам... Jun 8 2016, 05:50 zltigo QUOTE (GetSmart @ Jun 7 2016, 22:09) Можн... Jun 8 2016, 15:55  GetSmart Цитата(zltigo @ Jun 8 2016, 19:55) В отсу... Jun 8 2016, 21:39   zltigo QUOTE (GetSmart @ Jun 9 2016, 00:39) Здес... Jun 9 2016, 02:26    GetSmart Цитата(zltigo @ Jun 9 2016, 06:26) К чемк... Jun 9 2016, 05:35     zltigo QUOTE (GetSmart @ Jun 9 2016, 08:35) Иден... Jun 9 2016, 11:04      GetSmart Цитата(zltigo @ Jun 9 2016, 15:04) Так во... Jun 9 2016, 17:00 ViKo http://www.keil.com/support/man/docs/armcc...59124... Jun 8 2016, 09:22 KRS Насколько я помню
static union
безымянный - это ф... Jun 8 2016, 11:14 GetSmart легко находится в сети
КодHello All
In IAR C it... Jun 10 2016, 09:52 ViKo Топикстартер собирался исключительно имена элемент... Jun 9 2016, 09:19 dimone Цитата(ViKo @ Jun 9 2016, 12:19) Топикста... Jun 14 2016, 12:23  Dog Pawlowa Цитата(dimone @ Jun 14 2016, 15:23) -так ... Jun 14 2016, 22:15 aiwa Цитата(GetSmart @ Jun 9 2016, 08:35) Иден... Jun 9 2016, 13:59
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|