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

Bagaimanakah Saya Boleh Mengendalikan Koma dengan Betul dalam Makro C/C dengan Berbilang Argumen?

Patricia Arquette
Patricia Arquetteasal
2024-12-11 16:19:20322semak imbas

How Can I Handle Commas Correctly in C/C   Macros with Multiple Arguments?

Makro dan Koma dalam C/C

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!

Kenyataan:
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