Bagikan melalui


Compiler Warning (level 1) C4477

'function' : format string 'string' memerlukan argumen jenis 'type', tetapi nomor argumen variadic memiliki jenis 'type'

Pengkompilasi mendeteksi ketidakcocokan antara jenis argumen yang diperlukan untuk memenuhi tempat penampung dalam string format, dan jenis argumen yang disediakan. Penggunaan yang benar dari keluarga cetak dan pemindaian fungsi variadik mengharuskan Anda menyediakan argumen dari jenis yang ditentukan oleh string format. Ketidakcocokan umumnya berarti ada bug dalam kode Anda.

Untuk informasi tentang argumen yang terkait dengan tempat penampung string format keluarga printf, lihat Format sintaks spesifikasi: fungsi printf dan wprintf. Lihat dokumentasi untuk informasi khusus untuk fungsi fungsi.

Peringatan ini baru di Visual Studio 2015.

Contoh

Sampel ini menunjukkan dua peringatan C4477 untuk fungsi printf_s pertama, ketika dua argumen ditemukan dari jenis yang salah, dan juga menunjukkan cara memperbaiki masalah.

// C4477p.cpp
// compile with: cl /c /W4 C4477p.cpp
#include <stdio.h>

void print_func(int a, float f)
{
    printf_s("This takes int and double arguments %d and %f.\n", f, a); // C4477, expected int then double
    printf_s("This takes int and double arguments %d and %f.\n", a, f); // fix: types in correct order
}

Dalam pesan kesalahan pertama, pengkompilasi mendeteksi bahwa double argumen disediakan ketika int diharapkan. secara float otomatis dipromosikan ke double dalam daftar argumen variadik. Pesan kesalahan kedua menunjukkan bahwa pengkompilasi mengharapkan double argumen, tetapi int disediakan. Pengkompilasi tidak dapat memberi tahu bahwa Anda telah bertukar urutan argumen. Anda harus memeriksa string format untuk menentukan urutan argumen aktual dan menyediakan jenis argumen yang benar.