2011-01-10 13 views
12

Nach dem Einschalten msvc8 Prüfung fand ich:Was läuft vor main()?

  1. Parse GetCommandLine() argc und argv
  2. Standard C-Bibliothek Initialisierung
  3. C++ Konstruktor globaler Variablen

Diese drei Dinge genannt werden bevor Sie main() eingeben.

Meine Fragen sind:

  1. Wird diese Ausführungsreihenfolge anders sein, wenn ich mein Programm zu anderen Compiler (gcc oder armcc) Portierung oder anderen Plattform?
  2. Was macht die Initialisierung der Standard C-Bibliothek? Soweit ich weiß, ist setlocale() ein Muss.
  3. Ist es sicher, Standard-C-Funktionen im C++ - Konstruktor von globalen Variablen aufzurufen?
+0

Was versuchen Sie zu tun? Die Bibliotheksinitialisierung erzeugt auch einige Puffer für einige Funktionen (z. B. Puffer für Iostream). Es gibt zu viele verschiedene Aufgaben zum Auflisten. –

+0

Warum sollten die Bestellungen wichtig sein? – SmallChess

+0

Was läuft vor main? Was auch immer es jagt. –

Antwort

5

1: Wird diese Ausführungsreihenfolge anders sein, wenn ich mein Programm zu anderen Compiler (gcc oder armcc) Portierung oder anderen Plattform?

Ja.

2: Was macht die Initialisierung der Standard C-Bibliothek? Soweit ich weiß, ist setlocale() ein Muss.

Ich bin sicher, dass es andere Sachen gibt. Nach dem Start von main sollten Sie sich nicht auf irgendwelche globalen Objekte verlassen. Das bedeutet, dass Dinge wie Std-Streams (Std :: Cin, Std :: Cout) möglicherweise nicht verwendbar sind.

3: Ist es sicher, Standard-C-Funktionen im C++ - Konstruktor von globalen Variablen aufzurufen?

Wahrscheinlich nicht.

+1

@ephemient: Wahrscheinlich sicher. Aber wahrscheinlich keine gute Idee. Diese Streams verwenden das Gebietsschema eine andere globale Variable, aber ihr Wert kann das aktuelle Gebietsschema oder "C" sein oder nicht. Die nicht spezifizierte Reihenfolge ist kein wirkliches Problem (wenn Sie wissen, dass es existiert (Es ist nur ein Ärgernis, das bearbeitet werden kann (es ist ein Problem, wenn Sie nicht wissen, es existiert))). –

4

Hier ist ein article aus dem LSB (Linux Standard Base) Aufwand beschreiben, was __libc_start_main unter Linux tun könnte.

Im Einzelnen:

* performing any necessary security checks if the effective user 
    ID is not the same as the real user ID. 
* initialize the threading subsystem. 
* registering the rtld_fini to release resources when this dynamic 
    shared object exits (or is unloaded). 
* registering the fini handler to run at program exit. 
* calling the initializer function (*init)(). 
* calling main() with appropriate arguments. 
* calling exit() with the return value from main(). 

Und hier ist ein more detailed explanation.

Dies ist definitiv anders als Windows.

+0

Und das ist nicht einmal in das, was die C++ - Laufzeitbibliothek tut! – ephemient

+1

Ein C++ - Benutzer verletzt meinen Kopf genug, ohne zu versuchen, eine Implementierung der C++ - Laufzeitbibliothek zu betrachten ... –

Verwandte Themen