Bagikan melalui


Compiler Warning (level 3) C4839

penggunaan non-standar kelas 'type' sebagai argumen ke fungsi variadik

Kelas atau struktur yang diteruskan ke fungsi variadik seperti printf 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 C4839:

// C4839.cpp
// compile by using: cl /EHsc /W3 C4839.cpp
#include <atomic>
#include <memory>
#include <stdio.h>

int main()
{
    std::atomic<int> i(0);
    printf("%i\n", i); // error C4839: non-standard use of class 'std::atomic<int>'
                        // as an argument to a variadic function
                        // note: the constructor and destructor will not be called;
                        // a bitwise copy of the class will be passed as the argument
                        // error C2280: 'std::atomic<int>::atomic(const std::atomic<int> &)':
                        // attempting to reference a deleted function
}

Untuk memperbaiki kesalahan, Anda dapat memanggil fungsi anggota yang mengembalikan tipe yang dapat disalin secara mudah,

    std::atomic<int> i(0);
    printf("%i\n", i.load());

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

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