오류 메시지
오류 C2338은 컴파일 중 static_assert
오류로 인해 발생할 수 있습니다. 이 메시지는 static_assert
매개 변수에 의해 제공됩니다.
또한 오류 C2338은 컴파일러에 대한 외부 공급자에 의해 생성될 수도 있습니다. 대부분의 경우, 이러한 오류는 특성 공급자 DLL(예: ATLPROV)에 의해 보고됩니다. 이 메시지의 몇 가지 일반적인 형태는 다음과 같습니다.
'attribute' Atl 특성 공급자 : 오류 ATL번호 메시지
특성 'attribute'의 잘못된 사용
'usage': 특성 'usage'에 대한 잘못된 형식
이러한 오류는 복구할 수 없는 경우가 많으며 심각한 컴파일러 오류가 뒤따를 수 있습니다.
이러한 문제를 해결하려면 특성 사용법을 수정합니다. 예를 들어, 특성 매개 변수는 사용하기 전에 먼저 선언해야 하는 경우도 있습니다. ATL 오류 번호가 제공되는 경우, 더 구체적인 정보를 위해 해당 오류에 대한 설명서를 확인합니다.
표준 C++11 이상에서 constexpr
함수는 상수 식에서 사용될 때 더 이상 기본적으로 noexcept
로 간주되지 않습니다. 이 동작 변경은 CWG(Core Working Group) CWG 1351 문제를 해결한 결과이며, /permissive-
모드에서 사용하도록 설정됩니다. 다음 예제는 Visual Studio 2019 버전 16.1 이전 버전에서 컴파일되지만 Visual Studio 2019 버전 16.2에서 C2338을 생성합니다.
// c2338.cpp
// Compile using: cl /EHsc /W4 /permissive- c2338.cpp
constexpr int f() { return 0; }
int main() {
static_assert(noexcept(f()), "f should be noexcept"); // C2338 in 16.2
}
오류를 해결하려면 함수 선언에 noexcept
식을 추가합니다.
// c2338_fixed.cpp
// Compile using: cl /EHsc /W4 /permissive- c2338_fixed.cpp
constexpr int f() noexcept { return 0; }
int main() {
static_assert(noexcept(f()), "f should be noexcept");
}