Seseorang mungkin menghadapi kesukaran apabila menggunakan makro yang menerima berbilang argumen, terutamanya apabila argumen mengandungi koma. Pertimbangkan contoh berikut:
#define FOO(type, name) type name
Walaupun mudah untuk menggunakan makro dengan hujah seperti:
FOO(int, int_var);
Isu timbul apabila berurusan dengan hujah kompleks yang melibatkan koma, seperti:
FOO(std::map<int, int>, map_var); // Error: 3 arguments passed to macro 'FOO', which takes only 2
Untuk menangani perkara ini, seseorang boleh memperkenalkan jenis tersuai definisi:
typedef std::map<int, int> map_int_int_t; FOO(map_int_int_t, map_var); // Compiles successfully
Walau bagaimanapun, pendekatan ini tidak mempunyai ergonomik dan memerlukan penukaran jenis tambahan.
Penyelesaian alternatif melibatkan penentuan makro bernama COMMA:
#define COMMA ,
Dengan ini definisi, hujah kompleks boleh dihantar ke makro menggunakan makro COMMA, untuk contoh:
FOO(std::map<int COMMA int>, map_var);
Kaedah ini juga membenarkan rentetan hujah, seperti yang digambarkan dalam kod berikut:
#include <cstdio> #include <map> #include <typeinfo> #define STRV(...) #__VA_ARGS__ #define COMMA , #define FOO(type, bar) bar(STRV(type) \ " has typeid name \"%s\"", typeid(type).name()) int main() { FOO(std::map<int COMMA int>, std::printf); }
Kod ini akan mengeluarkan: "std::map
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Koma dalam Argumen Makro dalam C/C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!