Makros erstellen
-
Ich wollte ein Makro definieren, dass wenn es aufgerufen wird, das kompillieren von einigen funktionen aktiviert...
bsp:int main() { __ALLOW_CPU_THREADING return 0; }
ind der entsprechenden klasse habe ich probiert das makro so zu definieren:
#define __CPU_THREADING 0 #define __ALLOW_CPU_THREADING \ __CPU_THREADING 1 #ifndef NET_H_ #define NET_H_ #include <iostream> #include <vector> #include <boost/thread.hpp> ....
dann habe ich die funktionen so eingeschlossen:
#if __CPU_THREADING == 1 void NetThread(int iNmbNeurons, int iNmbThreads, int iThread, SimpleLayer* curLayer, void (Neuron::*funcPtr)() ); void NetThread(int iNmbNeurons, int iNmbThreads, int iThread, SimpleLayer* curLayer, void (Neuron::*funcPtr)(float), float arg); void RunFThrded(int iThreads = 8); void TrainBThrded(int iThreads = 8); #endif
leider bekomme ich folgendes:
./main.cpp:14: error: expected ‘;’ before numeric constant
ich wollte das so ähnlich wie in Qt machen, wo man über Q_Object die SIGNAL/SLOT-fähigkeit aktiviert indem man einfach in der Klasse Q_Object aufruft.
weis zufällig jemand wie man sowas umsetzen kann
-
dgrat schrieb:
ind der entsprechenden klasse habe ich probiert das makro so zu definieren:
#define __CPU_THREADING 0 #define __ALLOW_CPU_THREADING \ __CPU_THREADING 1
Du kannst vorherdefinierte Makros nicht mit neuem Wert "überschreiben", wie du es hier offensichtlich probierst. __ALLOW_CPU_THREADING enthält den Wert "0 1". Immer. __CPU_THREADING enthält den Wert "0".
Die Fehlermeldung resultiert daraus, dass "__ALLOW_CPU_THREADING durch den Text "0 1" ersetzt wird. Du hast also folgenden Code:
int main() { 0 1 return 0; }
Ist ja klar, dass sowas fehlschlägt.
Normalerweise schaut man auch nicht nach dem Wert der Makros, sondern nur ob die Makros definiert sind. Also statt "#if __CPU_THREADING == 1" machst du "#ifdef __ALLOW_CPU_THREADING". Dann muss irgendwo im Code (jeweils vor der Deklaration und Implementation, am besten Global (Unterstützt GCC und VC++)) das Makros __ALLOW_CPU_THREADING definiert werden, aber ohne Inhalt.
Merke: Makros sind reine Text-Substitution.
-
dgrat schrieb:
ich wollte das so ähnlich wie in Qt machen, wo man über Q_Object die SIGNAL/SLOT-fähigkeit aktiviert indem man einfach in der Klasse Q_Object aufruft.
weis zufällig jemand wie man sowas umsetzen kannDas Makro Q_OBJECT in Qt wird durch allerhand Funktionen ersetzt. Außerdem werden Dateien, die das Q_OBJECT Makro enthalten, vom Qt Meta-Object-Compiler (moc) geparset und es wird noch mehr extra Code erstellt, damit dieser ganzen Signal/Slot-Kram von Qt so funktioniert, wie er es tut.