Maison >développement back-end >C++ >Comment déterminer le nom de la classe en C sans la macro __CLASS__ ?

Comment déterminer le nom de la classe en C sans la macro __CLASS__ ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-07 21:09:02839parcourir

How to Determine Class Name in C   Without __CLASS__ Macro?

Détermination du nom de classe en C

L'absence d'équivalent direct à la macro __CLASS__ de Python en C laisse les développeurs chercher des solutions alternatives pour récupérer le nom de classe actuel pendant l'exécution.

Pour répondre à ce besoin, les développeurs ont conçu des macros qui exploitent diverses techniques pour extraire le nom de la classe à partir des informations fournies par la macro __PRETTY_FUNCTION__. Cette macro, lorsqu'elle est utilisée dans une méthode de classe, renvoie une chaîne représentant la signature de méthode complète, y compris le nom de la classe, le nom de la méthode et les paramètres.

L'une de ces macros, connue sous le nom de __METHOD_NAME__, utilise la fonction d'assistance methodName. pour analyser la chaîne __PRETTY_FUNCTION__. Elle supprime le type de retour, les modificateurs et les arguments, ne laissant que le nom de la classe et le nom de la méthode.

Par exemple :

inline std::string methodName(const std::string& prettyFunction)
{
    size_t colons = prettyFunction.find("::");
    size_t begin = prettyFunction.substr(0,colons).rfind(" ") + 1;
    size_t end = prettyFunction.rfind("(") - begin;

    return prettyFunction.substr(begin,end) + "()";
}

#define __METHOD_NAME__ methodName(__PRETTY_FUNCTION__)

Cette macro permet aux développeurs de récupérer facilement le nom de la classe en non -méthodes statiques. Cependant, lorsqu'elle est utilisée dans des méthodes statiques où le pointeur this n'est pas disponible, les développeurs doivent envisager d'autres macros qui utilisent la macro __PRETTY_FUNCTION__.

Pour les scénarios où seul le nom de la classe est requis, la macro __CLASS_NAME__ peut être utilisée :

inline std::string className(const std::string& prettyFunction)
{
    size_t colons = prettyFunction.find("::");
    if (colons == std::string::npos)
        return "::";
    size_t begin = prettyFunction.substr(0,colons).rfind(" ") + 1;
    size_t end = colons - begin;

    return prettyFunction.substr(begin,end);
}

#define __CLASS_NAME__ className(__PRETTY_FUNCTION__)

Cette macro s'adresse à la fois aux méthodes de classe et aux méthodes statiques, analysant la chaîne __PRETTY_FUNCTION__ pour extraire efficacement le nom de la classe.

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!

Déclaration:
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