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));
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk