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 CStringW
von 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));