А каким образом решается конфликт объявления нескольких разных анонимных структур или юнионов с одинаковыми названиями членов на том же уровне иерархии (локальном/глобальном)? Что там говорит стандарт о вложениях анонимных структур/юнионов? Все анонимные вложения тоже считаются одним уровнем области видимости, на котором запрещены одинаковые имена? Или запрет наложения имён только на том же уровне (не заходя в анонимные структуры), а поиск при компиляции будет вниз по иерархии (по анонимам) до первого встречного совпадающего имени? В последнем случае зарыта грабля. Логично, конечно, если при создании структуры правила поиска будут ближе к разбору исполняемого кода. Но т.к. факт анонимности структуры обнаруживается после создания компилятором её (анонимного) типа, то все проверки имён будут после. Проблема видится в том, что имена членов при этом не должны совпадать ни с какими именованными объектами, которые нельзя замещать на текущем уровне (локальном/глобальном). Это усложняет логику компилятора. Хотелось бы знать - ради чего.
Цитата(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