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 kann 😕

    Das 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.


Anmelden zum Antworten