2011-01-10 30 views
12

Después de probar en msvc8, que encontré:¿Qué funciona antes de main()?

  1. Analizar GetCommandLine() para argc y argv
  2. biblioteca estándar de C inicialización
  3. C++ Constructor de variables globales

Estas tres cosas se llaman antes de ingresar a main().

Mis preguntas son:

  1. ¿Esta orden de ejecución será diferente cuando portar mi programa a diferentes compilador (gcc o armcc), o una plataforma diferente?
  2. ¿Qué cosas hace la inicialización de la biblioteca estándar C? Hasta ahora sé que setlocale() es imprescindible.
  3. ¿Es seguro llamar a funciones C estándar dentro del constructor C++ de variables globales?
+0

¿Qué estás tratando de hacer? la inicialización de la biblioteca también crea algunos búfer para algunas funciones (por ejemplo, búfer para iostream). Hay demasiadas tareas misceláneas para enumerar. –

+0

¿Por qué importarían las órdenes? – SmallChess

+0

¿Qué funciona antes de main? Lo que sea que esté persiguiendo. –

Respuesta

5

1: Será este orden de ejecución será diferente cuando portar mi programa a diferentes compilador (gcc o armcc), o una plataforma diferente?

Sí.

2: ¿Qué cosas hace la inicialización de Standard C Library? Hasta ahora sé que setlocale() es imprescindible.

Estoy seguro de que hay otras cosas. No debe confiar en ninguna utilidad de objetos globales después de que main ha comenzado. Esto significa que cosas como std streams (std :: cin, std :: cout) pueden no ser utilizables.

3: ¿Es seguro llamar a las funciones C estándar dentro del constructor C++ de variables globales?

Probablemente no.

+1

@ephemient: Probablemente seguro. Pero probablemente no sea una buena idea. Estas secuencias utilizan la configuración regional de otra variable global, pero su valor puede ser o no la configuración regional actual o "C". El orden no especificado no es un problema real (si usted sabe que existe). Es solo una molestia que puede solucionarse (es un problema si usted no sabe que existe)). –

4

Aquí hay un article del esfuerzo LSB (Linux Standard Base) que describe lo que __libc_start_main podría hacer en Linux.

Específicamente:

* 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(). 

Y aquí es un more detailed explanation.

Esto es definitivamente diferente a Windows.

+0

¡Y eso ni siquiera está entrando en lo que hace la biblioteca de tiempo de ejecución de C++! – ephemient

+1

Ser un usuario de C++ me hiere la cabeza lo suficiente, sin intentar ver una implementación de la biblioteca de tiempo de ejecución C++ ... –