Freigeben über


Compilerfehler C2338

Fehlermeldung

Fehler C2338 kann durch einen static_assert Fehler während der Kompilierung verursacht werden. Die Nachricht wird von den static_assert Parametern bereitgestellt.

Fehler C2338 kann auch von externen Anbietern für den Compiler generiert werden. In den meisten Fällen werden diese Fehler von einer Attributanbieter-DLL gemeldet, z. B. ATLPROV. Einige gängige Formen dieser Nachricht umfassen:

  • 'attribute' Atl-Attributanbieter: Fehler ATL-Nummernmeldung

  • Falsche Verwendung des Attributs "attribute"

  • 'usage': falsches Format für attribut 'usage'

Diese Fehler sind häufig nicht behebbar und können einem schwerwiegenden Compilerfehler folgen.

Korrigieren Sie die Attributverwendung, um diese Probleme zu beheben. In einigen Fällen müssen Attributparameter beispielsweise deklariert werden, bevor sie verwendet werden können. Wenn eine ATL-Fehlernummer angegeben wird, überprüfen Sie die Dokumentation für diesen Fehler, um spezifischere Informationen zu erhalten.

In Standard C++11 und höher werden constexpr-Funktionen bei Verwendung in einem konstanten Ausdruck nicht mehr standardmäßig als noexcept angesehen. Dieser Behavior Change stammt aus der Auflösung von Core Working Group (CWG) CWG 1351 und ist im /permissive--Modus aktiviert. Das folgende Beispiel wird in Visual Studio 2019 Version 16.1 und früher kompiliert, erzeugt jedoch C2338 in Visual Studio 2019 Version 16.2:

// 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
}

Fügen Sie den Ausdruck noexcept zur Funktionsdeklaration hinzu, um den Fehler zu beheben:

// 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");
}