Teil einer Funktion aufrufsbedingt unterdrücken.



  • Hallo c-community,

    ich habe mal wieder ein Problem. Ich habe 2 Funktionen. Beide Funktionen können fremd aufgerufen werden und die erste Funktion ruft selbst die zweite Funktion auf.
    Nun möchte ich einen bestimmten Teil der zweiten Funktion nur dann ausführen lassen, wenn ich diese fremd aufrufe aber nicht, wenn die erste Funktion dies tut.

    Ich versuche dies mit folgendem Pseudo-Code mal besser darzustellen:

    Funktion 1

    int PseudoFunktion1(int Param1, int Param2){
        /*
         *  anderer quellcode
         */
        #define     DO_NOT_EXECUTE     /* dieser Teil soll die Ausführung des Teiles verhindern, der nur bei Fremdaufruf ausgeführt werden soll */
        PseudoFunction2(Param1, Param2);
        #undef      DO_NOT_EXECUTE     /* deaktivieren */
        /*
         *  weiterer quellcode
         */
    }
    

    Function 2

    int PseudoFunktion2(int Param1, int Param2){
        /*
         *  anderer Quellcode der immer ausgeführt werden soll
         */
        #ifndef     DO_NOT_EXECUTE      /* wenn Fremdaufruf, dann ist DO_NOT_EXECUTE nicht definiert, wenn Aufruf durch PseudoFunktion2 dann schon */
        /*
         *  Quellcode der nur ausgeführt werden soll, wenn Fremdaufruf.
         */
        #endif                          /* Ende */
        /*
         *  weiterer Quellcode
         */
    }
    

    Als Fremdaufruf meine ich dabei jeden Aufruf der PseudoFunktion2 von einer anderen Stelle im Programm außer aus PseudoFunktion1.

    Mit ddd habe ich diese Version getestet aber er steppt durch die komplette PseudoFunktion2 egal von wo sie aufgerufen wurde.

    Sieht jemand eventuell wo ich einen Fehler gemacht habe?

    MfG
    mirrowwinger



  • Separiere den "bestimmten Teil der zweiten Funktion" als eigene Funktion und rufe die dann entsprechend auf. Alles andere endet in heillosem Gefrickel.



  • mirrowwinger schrieb:

    Mit ddd habe ich diese Version getestet aber er steppt durch die komplette PseudoFunktion2 egal von wo sie aufgerufen wurde.

    Sieht jemand eventuell wo ich einen Fehler gemacht habe?

    Ja, du hast Präprozessor Makros nicht verstanden.

    Lösung: mach zwei neue Funktionen PseudoFunktion1Impl und PseudoFunktion2Impl mit nem zusätzlichen bool Parameter der angibt ob der Block ausgeführt werden soll.
    PseudoFunktion1Impl ruft dann PseudoFunktion2Impl auf.
    PseudoFunktion1 implementierst du als return PseudoFunktion1Impl(..., false) und entsprechend für PseudoFunktion2.
    Intern rufst du immer direckt PseudoFunktionNImpl(..., true) auf.

    Ferdich.


Log in to reply