реклама на сайте
подробности

 
 
> Анонимные структуры IAR vs Keil
dimone
сообщение Jun 4 2016, 10:24
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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
компилятор пропускает лишь объявление\определение, с предупреждением,
но при попытке обратиться к члену дает ошибку...
Может у кого-то будут идеи как минимальными затратами исправить ситуацию, уж больно не хочется перелопачивать всё )
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GetSmart
сообщение Jun 7 2016, 19:09
Сообщение #2


.
******

Группа: Участник
Сообщений: 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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 8 2016, 15:55
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (GetSmart @ Jun 7 2016, 22:09) *
Можно пример?

CODE
// Beacon Invite
typedef struct bi_s{
    air_header_s;
    union {
    bi_data_s;
    ushort     data_raw;
    };
} bi_s;

QUOTE
В чём полезность?

В отсутствии абсолютно лишних сущностей, когда они лишние.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 8 2016, 21:39
Сообщение #4


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Jun 8 2016, 19:55) *
В отсутствии абсолютно лишних сущностей, когда они лишние.

Здесь виднеется объявление члена внутри структуры только по одному идентификатору. Если это идентификатор type-object-name и он будет восприниматься как безымянный член с таким типом, то в этом ничего общего с инициированным ТС обсуждением. У него жалоба была на отсутствие (корневого) имени структуры-переменной. И Вами утверждалось, что Си (или C99 и выше) такое обязан уметь.

А если air_header_s и bi_data_s являются предворяющеми (до скобки {) именами stuct/union объявлений типов (то есть не совсем type-object-name), то в старом Си это наверняка было запрещено. Как и return с аргументом и без скобок. А если из нового стадарта следует, что такое имя и с предворяющим ключевым словом struct/union и без него означает одно и то же, то может такой код вполне однозначен. Если в старой интерпретации Си предворяющее struct/union имя никак не могло использоваться без struct/union-keyword.

Сообщение отредактировал GetSmart - Jun 8 2016, 22:35


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - Baser   Цитата(GetSmart @ Jun 7 2016, 22:09) А ка...   Jun 7 2016, 21:18
||- - GetSmart   Цитата(Baser @ Jun 8 2016, 01:18) Компиля...   Jun 7 2016, 21:45
||- - Baser   Цитата(GetSmart @ Jun 8 2016, 00:45) А пр...   Jun 8 2016, 09:16
||- - 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 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 12:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01413 секунд с 7
ELECTRONIX ©2004-2016