Menentukan Bilangan Argumen dalam Variadic Macro Menggunakan C Prapemproses VA_ARGS
Makro variadic dalam C membenarkan penggunaan bilangan hujah yang sewenang-wenangnya. Walau bagaimanapun, menentukan bilangan hujah yang dihantar kepada makro variadic boleh menjadi mencabar. Artikel ini meneroka penyelesaian yang mudah dan cekap menggunakan VA_ARGS makro prapemproses.
Pemahaman VA_ARGS
VA_ARGS ialah makro prapemproses terbina dalam yang berkembang kepada yang sebenar hujah diserahkan kepada makro variadic. Walau bagaimanapun, ia tidak memberikan sebarang maklumat tentang bilangan argumen.
Mengira Argumen Menggunakan Saiz Tatasusunan Integer
Untuk menentukan bilangan argumen dalam makro variadic, kami boleh mengeksploitasi tingkah laku saiz tatasusunan dalam prapemproses C. Makro berikut, NUMARGS(), menggunakan teknik ini:
#define NUMARGS(...) (sizeof((int[]){__VA_ARGS__})/sizeof(int))
Makro ini mengembang kepada saiz tatasusunan yang mengandungi semua argumen yang dihantar kepadanya, dibahagikan dengan saiz integer. Nilai yang terhasil ialah bilangan argumen.
Contoh Penggunaan
Pertimbangkan makro berikut, SUM(), yang mengira jumlah argumennya:
#define SUM(...) (sum(NUMARGS(__VA_ARGS__), __VA_ARGS__))
Untuk menggunakan SUM(), kami akan memanggilnya dengan nombor pembolehubah argumen, seperti jadi:
SUM(1); SUM(1, 2); SUM(1, 2, 3);
Makro NUMARGS() akan mengira bilangan argumen dan menyampaikannya bersama-sama dengan argumen kepada fungsi sum().
Mengendalikan Senarai Argumen Kosong
Secara lalai, makro NUMARGS() akan gagal jika dipanggil dengan senarai argumen kosong. Untuk menangani perkara ini, varian makro boleh ditakrifkan menggunakan sambungan GNU C:
#define NUMARGS(...) (sizeof((int[]){0, ##__VA_ARGS__})/sizeof(int)-1)
Varian ini membenarkan senarai argumen kosong dan mengira bilangan argumen dalam semua kes dengan betul.
Kesimpulan
Makro prapemproses VA_ARGS boleh dimanfaatkan untuk mengira bilangan argumen dalam makro variadic dengan cekap. Dengan menggabungkan teknik ini dengan manipulasi saiz tatasusunan integer, kami boleh membangunkan makro yang berguna untuk mengendalikan nombor pembolehubah argumen dalam C .
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menentukan Bilangan Argumen dalam Makro Variadik C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!