Standard Makro das Klassennamen zurückgibt



  • Hallo,

    und mal wieder weiß ich nicht weiter:

    Ich weiß das es ein standard Makro gibt, das den aktuellen Klassennamen zurückgibt. Leider finde ich per google gerade nichts. Jetzt wollte ich hier mal fragen ob jemand den Namen des Makros kennt.

    Kleines Beispiel:

    class myClass
    {
    public:
       void print()
       {
          std::cout << MAKRO_NAME << std::endl;
       }  // hier sollte dann "myClass" ausgegeben werden
    };
    

    Wäre super wenn mir jemand weiterhelfen könnte!

    EDIT:

    Das einzige was ich gefunden habe war "__FILE__", welches den Filenamen zurückgibt. Habe ich mich getäuscht und es exisitiert keines für Klassennamen, sondern nur dieses?



  • #include <cstdlib>
    #include <iostream>
    using namespace std;
    
    #define ClassName(X) #X
    
    class foo
    {
    public:
    foo()
    {
       cout << ClassName(foo);
    }
    };
    
    int main()
    {
        foo bar;
        return 0;
    }
    

    Büdde 🙂
    rya



  • Ein Makro ist mir nicht bekannt, aber es geht mit Hilfe von RTTI:

    typeid(*this).name();
    

    Vordefinierte Präprozessorvariablen findest du hier:
    http://www.cppreference.com/preprocessor/preprocessor_vars.html

    Greetz



  • Ok, dann hab ich mich wohl getäuscht. Werde wohl mit __FILE__ arbeiten (geht um einen Logger). RTTI möchte ich nicht extra für den Logger mitkompilieren müssen.

    Danke...

    PS @ Scorcher: das würde ich auch gerade noch schaffen 🙂



  • Einige Compiler unterstützen auch das Makro "__FUNC__", das dann auch bei Klassenmembern (bzw. Konstruktor/Destruktor) funktioniert.



  • Ich arbeite hier mit gcc-Version 3.4.6 und der kennt das Makro __FUNC__ leider nicht. Wäre auch zu schön gewesen 🙂
    Trotzdem danke, werde das mal daheim mit dem msvc Compiler probieren ob der das kann...



  • Tobias W schrieb:

    Ich arbeite hier mit gcc-Version 3.4.6 und der kennt das Makro __FUNC__ leider nicht. Wäre auch zu schön gewesen 🙂
    Trotzdem danke, werde das mal daheim mit dem msvc Compiler probieren ob der das kann...

    verwend halt __FUNCTION__ bzw __PRETTY_FUNCTION__ was dir fürs logging sicher besesr gefällt



  • Blöde Frage: Was is an der Lösung von mir auszusetzen? Sie tut genau das was du möchtest..
    rya.



  • Warum statt

    cout << ClassName(foo)
    

    nicht gleich

    cout << "foo"
    

    🙂
    Dann brauchst du gar keine Makros.



  • Naja, dein define macht ja nix anderes als ein Namen der übergeben wird per cout auszugeben. Aber ich schreibe einen richtigen logger, der einmal eingebunden wird und mit einem Makroaufruf (z.B. LOG_ERROR << "hallo" << LOG_ENDL;) so eine Ausgabe erzeugen soll:

    ERROR (2007-05-21 09:11:13, myClass on Line 311): hallo

    Im Quelltext soll so wenig Schreibaufwand wie möglich sein. Deswegen will ich den Klassennamen rausfinden und nicht wie in deinem Fall ihn übergeben. Aus diesem Grund werde ich wohl mit __FILE__ arbeiten (auch wenn mir __PRETTY_FUNCTION__ sehr gut gefällt), da myClass.cpp den Klassennamen beinhaltet.

    Edit:
    Tja, zu langsam...



  • Man muss den Klassennamen explizit eintragen?

    MfG Kimmi



  • Tobias W schrieb:

    Naja, dein define macht ja nix anderes als ein Namen der übergeben wird per cout auszugeben. Aber ich schreibe einen richtigen logger, der einmal eingebunden wird und mit einem Makroaufruf (z.B. LOG_ERROR << "hallo" << LOG_ENDL;) so eine Ausgabe erzeugen soll:

    ERROR (2007-05-21 09:11:13, myClass on Line 311): hallo

    Im Quelltext soll so wenig Schreibaufwand wie möglich sein. Deswegen will ich den Klassennamen rausfinden und nicht wie in deinem Fall ihn übergeben. Aus diesem Grund werde ich wohl mit __FILE__ arbeiten (auch wenn mir __PRETTY_FUNCTION__ sehr gut gefällt), da myClass.cpp den Klassennamen beinhaltet.

    Edit:
    Tja, zu langsam...

    Ok, ist nachvollziehbar 🙂 War leider aus deiner Frage nicht ersichtlich, dass du dieses "#" schon kennst.^^
    rya.



  • Das __FUNCTION__ Makro gibt es eigentlich auf fast jedem Compiler. Es heißt nur manchmal anders (__FUNC__ bei Borland). Im kommenden Standard soll es dann wohl als __func__ drin sein.
    Ich denke schon das man das so verwenden kann. Bei Bedarf kann man es ja mit diversen #ifdefs umdefinieren.
    http://lists.ibiblio.org/pipermail/freetds/2003q4/014164.html
    http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=338&rl=1


Anmelden zum Antworten