Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengendalikan Koma dengan Betul dalam Makro C/C dengan Berbilang Argumen?
Dalam C/C , makro sering digunakan untuk memudahkan dan menyamaratakan kod. Walau bagaimanapun, apabila makro mengambil berbilang argumen, mungkin sukar untuk mengendalikan koma dengan betul.
Pertimbangkan makro berikut:
#define FOO(type, name) type name
Makro ini boleh digunakan untuk mengisytiharkan pembolehubah jenis tertentu , sebagai contoh:
FOO(int, int_var);
Walau bagaimanapun, jika jenis mengandungi koma, seperti dalam parameter templat templat, makro gagal. Contohnya:
FOO(std::map<int, int>, map_var); // error: macro "FOO" passed 3 arguments, but takes just 2
Untuk menyelesaikan isu ini, satu pilihan ialah memperkenalkan typedef:
typedef std::map<int, int> map_int_int_t; FOO(map_int_int_t, map_var); // OK
Semasa pendekatan ini berfungsi, ia boleh menyusahkan dan memperkenalkan isu keserasian jenis.
Penyelesaian alternatif ialah menggunakan makro COMMA prapemproses:
#define COMMA , FOO(std::map<int COMMA int>, map_var);
Ini membenarkan koma dimasukkan dalam hujah makro tanpa menyebabkan ralat. Selain itu, ia boleh digunakan untuk menyambung hujah makro ke dalam rentetan:
#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 mencetak:
std::map<int , int> has typeid name "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"
Dengan menggunakan makro COMMA, pembangun boleh mengelakkan typedef dan memastikan koma dikendalikan dengan betul dalam makro.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Koma dengan Betul dalam Makro C/C dengan Berbilang Argumen?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!