main und Funktionszeiger



  • Folgenden Code verstehe ich nicht.

    Also die Extern "C" deklaration gegen mangling soweit ich weiss.
    Aber was soll der Rest mit dem void __main()
    und das mit den Funktionszeigern?
    Wann wird die Funktion __main überhaupt aufgerufen und was wird in der Schleife runtergezählt?

    Ich wäre dankbar wenn ihr mich ein wenig schlauer macht...

    #ifdef CPPAPP
    //Initialize global constructors
    extern "C" void __main()
    {
      static int initialized;
      if (! initialized)
        {
          typedef void (*pfunc) ();
          extern pfunc __ctors[];
          extern pfunc __ctors_end[];
          pfunc *p;
    
          initialized = 1;
          for (p = __ctors_end; p > __ctors; )
        (*--p) ();
    
        }
    }
    #endif 
    
    int main(void)
    {
        // TODO: add application code here
    
        while (1) {
        }
      return 0;
    }
    


  • brrrrrr schrieb:

    Aber was soll der Rest mit dem void __main()
    und das mit den Funktionszeigern?

    Kannst du die Frage präzisieren?

    Wann wird die Funktion __main überhaupt aufgerufen und was wird in der Schleife runtergezählt?

    Keine Ahnung, vermutlich automatisch vor dem Programmstart. Runtergezählt wird der Zeiger p.

    Der Zweck des ganzen ist vermutlich, die Konstruktoren (bzw. den Initialisierungscode) globaler Objekte für den Fall, dass es sich um ein C++-Programm handelt, aufzurufen. Die Adressen der Konstruktoren stehen in __ctors, dieses Array wird einfach rückwärts durchlaufen und elementweise aufgerufen.

    Solcher Code gehört eigentlich in die Laufzeitbibliothek, nicht in den Anwendungscode. Wieso steht der da überhaupt, woher hast du den, was machst du damit etc.? Deine main sieht aus, als wär sie für einen Microcontroller, vielleicht hat der gar keine C++-taugliche Laufzeitbibliothek oder so, keine Ahnung 😕

    Aber ohne da mehr zu wissen, was nur du wissen kannst (indem du die Dokumentation liest), ist das sowieso alles ziemlich fragwürdig. Warum ruft __main nicht main auf? Und was passiert mit globalen Destruktoren? Und was soll das initialized, wird __main etwa mehrmals aufgerufen?



  • Entschuldige die späte Antwort.
    Ja der Code ist für einen Renesas Microcontroler. Er wurde von e2Studio als sample executable Projekt erstellt.
    Den Code kann ich lesen und auch verstehen, also dass eine Schleife rückwärts zählt, die Funktionen über Pointer aufruft...
    Die Frage die ich habe ist jene die du auch stellst...
    WARUM ist der Code dort.

    Woraus konntest Du schliessen das der Code für einen Microcontroller ist?



  • brrrrrr schrieb:

    Die Frage die ich habe ist jene die du auch stellst...
    WARUM ist der Code dort.

    Tja, ich denke man kann den Code auch einfach so akzeptieren. Der sollte da zwar nicht stehen müssen, aber wenn die Implementation so komisch ist, dass sie das braucht, dann ist das halt so. Ich würd trotzdem die Doku nach Informationen durchforsten.

    Woraus konntest Du schliessen das der Code für einen Microcontroller ist?

    Wegen der Endlosschleife in der main. Microcontrollerprogramme können ja nicht wirklich beendet werden.


Log in to reply