Bagikan melalui


Compiler Warning (level 4) C4840

penggunaan non-portabel dari kelas 'type' sebagai argumen ke fungsi variadik

Keterangan

Kelas atau struktur yang diteruskan ke fungsi variadik harus dapat disalin secara sepele. Saat meneruskan objek tersebut, pengkompilasi hanya membuat salinan bitwise dan tidak memanggil konstruktor atau destruktor.

Peringatan ini tersedia dimulai di Visual Studio 2017.

Contoh

Sampel berikut menghasilkan C4840 dan menunjukkan cara memperbaikinya:

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

Untuk string yang dibangun dan dikelola menggunakan CStringW, yang disediakan operator LPCWSTR() harus digunakan untuk mentransmisikan CStringW objek ke penunjuk string gaya C yang diharapkan oleh string format:

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