Udostępnij za pośrednictwem


Ostrzeżenie kompilatora (poziom 4) C4840

zamiast przenośnego użycia klasy "type" jako argumentu do funkcji wariadycznej

Uwagi

Klasy lub struktury przekazywane do funkcji wariadycznej muszą być trywialnie kopiowalne. Podczas przekazywania takich obiektów kompilator po prostu wykonuje kopię bitową i nie wywołuje konstruktora ani destruktora.

To ostrzeżenie jest dostępne począwszy od programu Visual Studio 2017.

Przykład

Poniższy przykład generuje kod C4840 i pokazuje, jak go naprawić:

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

W przypadku ciągów skompilowanych i zarządzanych przy użyciu CStringWparametru należy użyć elementu operator LPCWSTR() , aby rzutować CStringW obiekt do wskaźnika ciągu w stylu C oczekiwanego przez ciąg formatu:

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