Поделиться через


Предупреждение компилятора (уровень 4) C4471

"перечисление": объявление пересылки без область d перечисления должно иметь базовый тип (предполагается int).

Объявление пересылки не область считываемого перечисления было найдено без описателя базового типа. По умолчанию Visual C++ предполагает int , что базовый тип перечисления. Это может привести к проблемам, если в определении перечисления используется другой тип, например, если указан другой явный тип или если другой тип неявно задан инициализатором. У вас также могут возникнуть проблемы с переносимостью; Другие компиляторы не предполагают int , что базовый тип перечисления.

Это предупреждение отключено по умолчанию; вы можете использовать /Wall или /wN4471, чтобы включить его в командной строке или использовать предупреждение #pragma в исходном файле.

Примеры

В некоторых случаях это предупреждение является спрогнозным. Если после определения появится объявление пересылки для перечисления, это предупреждение может срабочить. Например, этот код действителен, даже если он может вызвать C4471:

// C4471a.cpp
// Compile with: cl /c /w14471 C4471a.cpp
enum Example { item = 0x80000000UL };
enum Example;    // Spurious C4471
// ...

Как правило, можно использовать полное определение для перечисления un область d вместо объявления пересылки. Определение можно поместить в файл заголовка и включить его в исходные файлы, ссылающиеся на него. Это работает в коде, написанном для C++98 и более поздних версий. Мы рекомендуем это решение для переносимости и удобства обслуживания.

// C4471b.cpp
// Compile with: cl /c /w14471 C4471b.cpp
enum Example;    // C4471
// To fix, replace the line above with the enumeration definition:
// enum Example { item = 0x80000000UL };
// ...

В C++11 можно добавить явный тип в перечисление un область d и в его объявление пересылки. Мы рекомендуем это решение только в том случае, если сложная логика включения заголовков запрещает использование определения вместо объявления пересылки. Это решение может привести к проблеме обслуживания: если вы изменяете базовый тип, используемый для определения перечисления, необходимо также изменить все объявления пересылки на соответствие, или в коде могут возникнуть автоматические ошибки. Вы можете поместить объявление вперед в файл заголовка, чтобы свести к минимуму эту проблему.

Исходный файл C4471c.cpp:

// C4471c.cpp
// Client code for enumeration defined in C4471d.cpp
// Compile with: cl /c /w14471 C4471c.cpp C4471d.cpp
enum Example;    // C4471, int assumed
// To fix, replace the lines above with the forward declarations:
// enum Example : unsigned;
// ...

Исходный файл C4471d.cpp:

// C4471d.cpp
// Definition for enumeration used in C4471c.cpp
// Compile with: cl /c /w14471 C4471c.cpp C4471d.cpp
enum Example : unsigned { item = 0x80000000 }; // explicit type
// ...

Если для перечисления указан явный тип, рекомендуется также включить предупреждение C4369, которое по умолчанию. Это определяет случаи, когда элемент перечисления требует другого типа, отличного от явно указанного типа.

Вы можете изменить код на использование перечисления область, новой функции в C++11. Чтобы использовать перечисление область d, необходимо изменить определение и любой клиентский код, использующий тип перечисления. Рекомендуется использовать перечисление область, если у вас возникли проблемы с загрязнением пространства имен, так как имена определенных элементов перечисления ограничены область перечисления. Еще одной особенностью перечисления область является то, что его члены не могут быть неявно преобразованы в другой целочисленный или перечислительный тип, который может быть источником тонких ошибок.

Исходный файл C4471e.cpp:

// C4471e.cpp
// Client code for scoped enumeration defined in C4471f.cpp
// Compile with: cl /c /w14471 C4471e.cpp C4471f.cpp
enum Example;    // C4471
// To fix, replace the line above with the forward declaration:
// enum class Example;
// ...

Исходный файл C4471f.cpp:

// C4471f.cpp
// Definition for scoped enumeration used in C4471e.cpp
// Compile with: cl /c /w14471 C4471e.cpp C4471f.cpp
enum class Example { item = 0 };
// ...