Почему глобальные анонимные союзы должны быть объявлены как статические? - PullRequest
6 голосов
/ 02 ноября 2010

C ++ 0x осадка

9.5.6 Анонимные объединения, объявленные в именованном пространстве имен или в глобальном пространстве имен, должны быть объявлены статическими.

Почему?


Обновление-

Основываясь на ответах Барта ван Ингена Шенау и Лотара, лучшее объяснение на данный момент может быть таким:

Если один и тот же глобальный анонимный союз встречается в двух единицах перевода (скажем, через файл заголовка), то как может быть выполнено одно правило определения? Являются ли эти два определения одинаковыми и объединены ли? Или два определения рассматриваются как разные? Если они обрабатываются как одинаковые, то, по-видимому, компилятор совершает «магию», в отличие от других сущностей. Если они обрабатываются как одинаковые, то компилятор делает это без явного согласия программиста ... поэтому я предполагаю, что явное согласие навязывается, требуя, чтобы оно было объявлено как статическое.

Ответы [ 6 ]

4 голосов
/ 02 ноября 2010

Предположим, анонимные объединения не должны были быть объявлены статическими, и компилятор встречает эти два модуля перевода (после предварительной обработки):

Файл1:

union {
  int  a;
  char b;
};

// Further contents referring to a and b

Файл2:

union {
  int  a;
  char b;
};

// Further (different) contents referring to a and b

Являются ли эти два союза одним и тем же объектом, или они должны быть разными объектами?

Я думаю, что во избежание таких неопровержимых вопросов, как это, было решено, что пространство имен-области анонимных союзов должны быть объявлены статическими.

1 голос
/ 02 ноября 2010

Я полагаю, что если разрешить определять объединение нестатическим способом, это может нарушить ODR (одно правило определения)

1 голос
/ 02 ноября 2010

Мое лучшее предположение:

Если бы он был нестатичным, на него мог бы ссылаться другой код.Но как бы другой код назвал это?Это анонимно.Следовательно, необходимо ограничить анонимный союз какой-либо локальной областью действия;следовательно, он должен быть объявлен статическим.

Но это всего лишь предположение.Языковые дизайнеры могут создавать вещи так, как им хочется.Иногда их выбор произвольный, просто потому что какой-то выбор должен быть сделан.

0 голосов
/ 05 марта 2019

сделать анонимный союз локальным вместо глобального

0 голосов
/ 23 июля 2017

Не было оправдания статическому требованию, и оно должно быть удалено. Компилятор обрабатывает и должен обрабатывать несколько элементов объединения как несколько отдельных глобальных переменных, имеющих один и тот же адрес. На практике это означает, что компилятор позволяет применять несколько типов к одному и тому же адресу. Поскольку область действия глобального анонимного объединения является глобальной областью действия, правила именования элементов в анонимных объединениях должны быть (и быть) такими же, как правила именования глобальных переменных. то есть имена анонимных элементов объединения должны быть уникальными. Что касается инициализации объединения - нет разницы между инициализацией объединения и простой переменной. Еще один момент, касающийся статических объединений - значение и тип объединения зависят от времени. Обратите внимание, что только одно значение за раз может занимать объединение независимо от количества элементов в нем. Причина объявления объединения для начала состоит в том, что один и тот же адрес может использоваться для разных типов динамически в разное время. Вот почему статические объединения - это неправильное название, а некоторые компиляторы просто игнорируют его.

0 голосов
/ 02 ноября 2010

$ 9,5 / 5- Объединение вида union { спецификация члена}; называется анонимный союз; определяет безымянный объект безымянного типа .

Я предполагаю, что он должен быть статическим, чтобы объект мог быть инициализирован согласно правилу глобальных статических объектов. Если он не является статичным и объект не имеет имени, то как его инициализировать?

EDIT2:

О переосмыслении ...

Члены анонимных союзов имеют внутреннюю связь. Кроме того, по умолчанию глобальные имена имеют внешнюю связь, если они не имеют внутренней связи. Если имя анонимного объединения имеет внешнюю связь, то члены анонимного союза не могут иметь внутреннюю связь. Поэтому анонимные объединения объявляются с помощью «статического» спецификатора класса хранения, так что само анонимное имя имеет внутреннюю связь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...