Marko spielt mir Streiche



  • Hi.
    Ich bin gerade dabei, mir ein bisschen Tipparbeit zu ersparen.
    Ich habe eine recht einfache Klasse erstellt - zum testen halt.

    Das Makro sieht folgendermaßen aus:

    #define PYCMD_ADD(classname, command, description) \
    	m_pPython->addCommand(command, classname##_##command##_py, description);
    

    Es sollte beim Ausführen folgendem Code entsprechen:

    m_pPython->addCommand("spawnPlayer", Spawn_spawnPlayer_py, "Spawns a player into world");
    

    Doch leider wirft die Makroversion Fehler.
    Füge ich den Code ohne Makro ein, geht es problemlos. Mit Makro kommt jedoch folgende Meldung:

    error C3867: "CSpawn::spawnPlayer": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&CSpawn::spawnPlayer", um einen Zeiger auf den Member zu erstellen.
    

    Auch wenn ich ein & vor den Makronamen packe ändert sich nichts (für meinen Zweck wäre es eh sinnlos). Die Funktion Spawn_spawnPlayer-py ist vom Typ PyCFunction und sieh existiert.

    Hier ist nochmal der Prototype der CPython::addCommand Funktion:

    void CPython::addCommand(char *pszCommand, PyCFunction pyCallback, char *pszDescription);
    

    Gruß und Danke an alle im voraus.
    (Ich hoffe ich habe genug Informationen geliefert um das Problem nachzuvollziehen)



  • Zeig mal, wie du das Makro benutzt.



  • Meistens bieten die Compiler die Möglichkeit, sich den Code nach dem Präprozessor anzuschauen. guck doch mal was der draus macht, und wo der Unterschied zum Handgetippten Code ist.



  • Hi.
    @ Troll: Hier ist der Aufruf aus meiner Klasse CSpawn:

    CSpawn::CSpawn(void)
    {
    	//m_pPython->addCommand("spawnPlayer", Spawn_spawnPlayer_py, "Spawns a player into world");
    	PYCMD_ADD(Spawn, spawnPlayer, "Spawns a player into world");
    }
    

    @ pumuckl: In MSVC (2008) finde ich dazu nirgends eine Option / Möglichkeit.

    Gruß und Danke für die wirklich schnellen Antworten 🙂



  • #define PYCMD_ADD(classname, command, description) \
    	m_pPython->addCommand(#command, classname##_##command##_py, description);
    

    Versuchs mal so.



  • Hi.
    Wow - das geht!
    Jedoch verstehe ich nicht so recht, wieso dass fehlende # an dieser Stelle ausschlaggebend ist.
    Die einzig logische Erklärung für mich wäre, dass es im Code dann so aussieht:

    CSpawn::CSpawn(void)
    {
        m_pPython->addComand(spawnPlayer, ...);
    }
    

    Und dann ist der Compiler schlau und merkt, dass spawnPlayer eine Memberfunktion ist und setzt den thispointer davor, also wäre es im Code:

    CSpawn::CSpawn(void)
    {
        m_pPython->addComand(this->spawnPlayer, ...);
    }
    

    Und deshalb meckert er, weil wahlweise die () fehlen oder halt ein & um einen Pointer zu erzeugen.

    Stimmt meine Annahme so?

    Gruß und vielen Dank!



  • Das # macht aus dem Makro-Argument einen String.

    #define MACRO(a) #a
    std::cout << MACRO(ich_bin_ein_string)
    


  • theliquidwave schrieb:

    @ pumuckl: In MSVC (2008) finde ich dazu nirgends eine Option / Möglichkeit.

    google hilft: Kommandozeilenoption /P erzeugt eine .i-Datei mit dem Präprozessoroutput

    In der IDE: Rechtsklick aufs Projekt ->Properties, dort unter Configuration Properties->C/C++->Preprocessor das Item "Generate Preprocessed File"



  • Ok.
    Vielen Dank an euch beide, ihr habt mir sehr schnell geholfen 🙂

    Gruß


Anmelden zum Antworten