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ß