Maison > développement back-end > C++ > Comment puis-je gérer les virgules dans les macros C/C avec plusieurs arguments ?

Comment puis-je gérer les virgules dans les macros C/C avec plusieurs arguments ?

Patricia Arquette
Libérer: 2024-12-04 20:59:13
original
777 Les gens l'ont consulté

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

Virgule en macro C/C : une solution pour plusieurs arguments de macro

Les macros en C/C offrent un moyen pratique d'étendre un préprocesseur directive dans un bloc de code. Cependant, lorsque les macros acceptent plusieurs arguments, la gestion des virgules peut devenir un défi.

Considérons l'exemple de macro :

#define FOO(type,name) type name
Copier après la connexion

Cette macro attend deux arguments : un type et un nom. Son utilisation est simple dans les cas simples :

FOO(int, int_var);
Copier après la connexion

Mais lorsque le type est plus complexe, comme un modèle ou un conteneur, passer des virgules peut entraîner des erreurs :

FOO(std::map<int, int>, map_var); // error
Copier après la connexion

Un La solution consiste à définir un alias de type pour supprimer le besoin de virgules :

typedef std::map<int, int> map_int_int_t;
FOO(map_int_int_t, map_var);
Copier après la connexion

Cependant, cette approche peut être lourde et introduire une compatibilité de type problèmes.

Une solution alternative consiste à utiliser une macro virgule pour gérer les virgules dans la définition de la macro elle-même :

#define COMMA ,

FOO(std::map<int COMMA int>, map_var);
Copier après la connexion

Cela définit une macro virgule qui peut être placée entre les arguments pour gérer les séparation par virgule. Cette méthode fournit un moyen plus propre et plus simple de transmettre des types complexes à une macro :

#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);
}
Copier après la connexion

Ce code imprimera les informations de type pour std::map:

std::map<int , int> has typeid name "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"
Copier après la connexion

L'utilisation d'une macro virgule permet plus de flexibilité et une syntaxe plus claire lorsque vous travaillez avec des macros qui acceptent plusieurs arguments.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal