Bagikan melalui


Compiler Warning (level 1) C4473

'function' : tidak cukup argumen yang diteruskan untuk string format
tempat penampung dan parameternya mengharapkan argumen variadik angka , tetapi angka disediakan
indeks argumen variadik yang hilang diperlukan oleh string format 'format_string'
argumen ini digunakan oleh penentu konversi
argumen ini digunakan sebagai lebar bidang
argumen ini digunakan sebagai presisi
argumen ini digunakan sebagai ukuran buffer

Pengkompilasi mendeteksi ketidakcocokan antara jumlah argumen yang diperlukan untuk memenuhi tempat penampung dalam string format, dan jumlah argumen yang disediakan. Penggunaan yang benar dari keluarga cetak dan pemindaian fungsi variadik mengharuskan Anda menyediakan argumen sebanyak yang ditentukan oleh string format. Tempat penampung tertentu memerlukan argumen tambahan, untuk menentukan lebar, presisi, atau ukuran buffer, serta argumen untuk konten. 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 cara memperingatkan C4473 dapat dihasilkan dari ketidakcocokan string format dengan argumennya, dan juga menunjukkan cara memperbaiki masalah.

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

void print_func(int a, float f)
{
    printf_s("This takes %*f arguments.\n", f); // C4473, missing * width argument
    printf_s("This takes %*f arguments.\n", a, f); // fix: supply width argument
}

Dalam pesan kesalahan pertama, pengkompilasi mendeteksi bahwa argumen hilang, tetapi tidak dapat mengetahui apakah argumen yang hilang adalah lebar atau konten, sehingga mengasumsikan argumen yang disediakan adalah argumen pertama, untuk lebar, dan argumen yang hilang adalah argumen kedua, untuk penentu konversi jenis. Anda harus memeriksa string format untuk menentukan argumen yang sebenarnya hilang.

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

void scan_func(int a, float f)
{
    char name[20];

    scanf_s("%s", &name);                // C4473, missing buffer size argument
    scanf_s("%s", &name, sizeof(name));  // fix: supply buffer size argument
}

Dalam contoh ini, scanf_s memerlukan dua argumen untuk setiap tempat penampung, satu untuk menyediakan alamat untuk ditulis, dan satu detik untuk menyediakan ukuran yang pertama. Periksa dokumentasi untuk setiap fungsi pustaka untuk penjelasan tentang argumen yang diperlukan.