Почему я получаю предупреждение анонимного типа для этого кода?

При компиляции моего проекта я получаю предупреждение анонимные типы, объявленные в анонимном объединении, являются расширением [-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, имя из структуры. Но в настоящее время структура не должна быть анонимного типа?

1

Решение

Потому что стандарт так говорит ([class.union.anon]):

Примечание: вложенные типы, анонимные
союзы и функции не могут быть объявлены в анонимном союзе.

Формулировка предупреждения могла бы использовать некоторую работу, все же. Clang позволяет (как расширение компилятора) неназванный вложенные структуры и дополнительные анонимные союзы в анонимном союзе*, таким образом, кажется, что автор предупреждения стал немного ленивым и решил, что «анонимные типы» были хорошей ловушкой.

Обратите внимание, что давая ваш union имя (таким образом, объединение больше не является анонимным) заставляет предупреждение исчезнуть.

* Именованные структуры по-прежнему запрещены в анонимных союзах (и анонимной структуры не существует)

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]