Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Mengendalikan Koma dalam Argumen Makro dalam C/C?

Bagaimanakah Saya Boleh Mengendalikan Koma dalam Argumen Makro dalam C/C?

Linda Hamilton
Lepaskan: 2024-12-17 06:29:25
asal
909 orang telah melayarinya

How Can I Handle Commas in Macro Arguments in C/C  ?

Koma dalam Makro dalam C/C

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
Salin selepas log masuk

Walaupun mudah untuk menggunakan makro dengan hujah seperti:

FOO(int, int_var);
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

Walau bagaimanapun, pendekatan ini tidak mempunyai ergonomik dan memerlukan penukaran jenis tambahan.

Penyelesaian alternatif melibatkan penentuan makro bernama COMMA:

#define COMMA ,
Salin selepas log masuk

Dengan ini definisi, hujah kompleks boleh dihantar ke makro menggunakan makro COMMA, untuk contoh:

FOO(std::map<int COMMA int>, map_var);
Salin selepas log masuk

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);
}
Salin selepas log masuk

Kod ini akan mengeluarkan: "std::map mempunyai nama taip "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"."

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan