При компиляции моего проекта я получаю предупреждение анонимные типы, объявленные в анонимном объединении, являются расширением [-Wnested-anon-types]. Мой код содержит этот союз:
union
{
uint32_t m_bits; // All bits
struct
{
uint32_t significand : 23;
uint32_t exponent : 8;
uint32_t sign : 1;
} IEEE;
};
Насколько другие ответы на сайте сказали, я бы ожидал, что это предупреждение, если я опущу IEEE
, имя из структуры. Но в настоящее время структура не должна быть анонимного типа?
Потому что стандарт так говорит ([class.union.anon]):
Примечание: вложенные типы, анонимные
союзы и функции не могут быть объявлены в анонимном союзе.
Формулировка предупреждения могла бы использовать некоторую работу, все же. Clang позволяет (как расширение компилятора) неназванный вложенные структуры и дополнительные анонимные союзы в анонимном союзе*, таким образом, кажется, что автор предупреждения стал немного ленивым и решил, что «анонимные типы» были хорошей ловушкой.
Обратите внимание, что давая ваш union
имя (таким образом, объединение больше не является анонимным) заставляет предупреждение исчезнуть.
* Именованные структуры по-прежнему запрещены в анонимных союзах (и анонимной структуры не существует)
Других решений пока нет …