Anda perlu menggunakan size
bukannya fmt
:
va_start(args, size);
Ini adalah size
, bukan fmt
, itu adalah parameter terakhir yang memiliki nama eksplisit (berlawanan dengan parameter vararg, yang tidak memiliki nama). Anda harus meneruskan parameter bernama terakhir ke va_start
agar dapat mengetahui alamat di memori tempat parameter vararg dimulai.
second parameter of ‘va_start’ not last named argument
Apa artinya dan bagaimana cara menghapusnya?
Fungsi Anda telah menamai parameter parent
, fmt
dan size
. Spesifikasi C mengatakan Anda harus selalu meneruskan parameter bernama terakhir ke va_start
, untuk kompatibilitas dengan kompiler lama. Jadi, Anda harus melewati size
, bukan fmt
.
(Tetapi dengan kompiler modern, ini mungkin tetap berfungsi)
Saya pikir ada kebingungan di sini:kebanyakan orang hanya berurusan dengan fungsi seperti prinf yang memiliki format dan varargs. dan mereka pikir mereka harus memberikan nama parameter yang menjelaskan format. namun va_start tidak ada hubungannya dengan format seperti printf apa pun. ini hanyalah fungsi yang menghitung offset pada tumpukan tempat parameter tanpa nama dimulai.