Freigeben über


Compilerwarnung (Stufe 4) C4840

nicht portierbarer Klassentyp als Argument für eine variadische Funktion

Hinweise

Klassen oder Strukturen, die an eine variadische Funktion übergeben werden, müssen trivial kopierbar sein. Wenn solche Objekte übergeben werden, macht der Compiler einfach eine bitweise Kopie und ruft keinen Konstruktor oder Destruktor auf.

Diese Warnung ist ab Visual Studio 2017 verfügbar.

Beispiel

Im folgenden Beispiel wird C4840 generiert und veranschaulicht, wie sie behoben werden:

// C4840.cpp
// compile by using: cl /EHsc /W4 C4840.cpp
#include <stdio.h>

int main()
{
    struct S {
        S(int i) : i(i) {}
        S(const S& other) : i(other.i) {}
        operator int() { return i; }
    private:
        int i;
    } s(0);

    printf("%i\n", s); // warning C4840 : non-portable use of class 'main::S'
                       // as an argument to a variadic function
    // To correct the error, you can perform a static cast
    // to convert the object before passing it:
    printf("%i\n", static_cast<int>(s));
}

Für mithilfe CStringWvon Zeichenfolgen erstellte und verwaltete Zeichenfolgen sollte das bereitgestellte Objekt operator LPCWSTR() in CStringW den von der Formatzeichenfolge erwarteten C-Zeichenfolgenzeiger umwandeln:

    CStringW str1;
    CStringW str2;
    // ...
    str1.Format("%s", static_cast<LPCWSTR>(str2));