컴파일러 경고(수준 4) C4471
'enumeration': 범위가 지정되지 않은 열거형의 정방향 선언에는 내부 형식이 있어야 합니다(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
// ...
일반적으로 정방향 선언 대신 범위가 지정되지 않은 열거형에 전체 정의를 사용하는 것이 안전합니다. 헤더 파일에 정의를 넣고 이를 참조하는 원본 파일에 포함할 수 있습니다. 이는 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에서는 범위가 지정되지 않은 열거형 및 해당 전달 선언에 명시적 형식을 추가할 수 있습니다. 복잡한 헤더 포함 논리가 정방향 선언 대신 정의를 사용할 수 없는 경우에만 이 솔루션을 사용하는 것이 좋습니다. 이 솔루션은 유지 관리 문제로 이어질 수 있습니다. 열거형 정의에 사용되는 기본 형식을 변경하는 경우 일치하도록 모든 정방향 선언을 변경해야 하거나 코드에 자동 오류가 있을 수 있습니다. 헤더 파일에 전달 선언을 넣어 이 문제를 최소화할 수 있습니다.
원본 파일 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의 새로운 기능인 범위가 지정된 열거형을 사용하도록 코드를 변경할 수 있습니다. 정의와 열거형 형식을 사용하는 모든 클라이언트 코드는 범위가 지정된 열거형을 사용하도록 변경해야 합니다. 정의된 열거형 항목의 이름이 열거형의 범위로 제한되므로 네임스페이스 오염에 문제가 있는 경우 범위가 지정된 열거형을 사용하는 것이 좋습니다. 범위가 지정된 열거형의 또 다른 기능은 멤버를 미묘한 버그의 원인일 수 있는 다른 정수 또는 열거형 형식으로 암시적으로 변환할 수 없다는 것입니다.
원본 파일 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 };
// ...