Partager via


Avertissement du compilateur (niveau 4) C4840

utilisation non portable de la classe « type » en tant qu'argument d'une fonction variadique

Notes

Les classes ou structs passés à une fonction variadicique doivent être copiables de manière triviale. Quand de tels objets sont passés, le compilateur effectue simplement une copie au niveau du bit et n’appelle pas le constructeur ou le destructeur.

Cet avertissement est disponible à partir de Visual Studio 2017.

Exemple

L’exemple suivant génère l’erreur C4840 et montre comment la corriger :

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

Pour les chaînes générées et gérées à l’aide CStringW, l’objet fourni operator LPCWSTR() doit être utilisé pour convertir un CStringW objet en pointeur de chaîne de style C attendu par la chaîne de format :

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