tipos significado rangos que programa ejemplos declaracion datos codigo c scope initialization variable-assignment

significado - Primera declaración ejecutable en C



tipos de variables en c++ y su significado (6)

¿Es main realmente la primera función o primera declaración ejecutable en un programa C? ¿Qué sucede si hay una variable global int a=0; ?

Siempre me han enseñado que main es el punto de partida de un programa. ¿Pero qué pasa con la variable global a la que se le asigna algún valor y es una declaración ejecutable en mi opinión?


¿Pero qué pasa con la variable global a la que se le asigna algún valor y es una afirmación que puede ser ejecutable en mi opinión?

Tu opinión es incorrecta

En un contexto global, solo puede existir una definición de variable, con una inicialización explícita. Todas las instrucciones ejecutables (es decir, la tarea) deben residir dentro de una función.

Para elaborar, en un contexto global, no se puede tener una declaración como

int globalVar; globalVar = 0; //error, assignement statement should be inside a function

sin embargo, lo anterior sería perfectamente válido dentro de una función, como

int main() { int localVar; localVar = 0; //assignment is valid here.

En cuanto a la inicialización , como

int globalVar = 0;

la inicialización tiene lugar antes del inicio de main() , entonces esa no es realmente la parte de la ejecución , per se.

Para elaborar el escenario de la inicialización de una variable global, citando el C11 , capítulo 6.2,

Si el declarador o el especificador de tipo que declara el identificador aparece fuera de cualquier bloque o lista de parámetros, el identificador tiene un alcance de archivo , que finaliza al final de la unidad de traducción.

y para variables de alcance flie ,

Si la declaración de un identificador para un objeto tiene un alcance de archivo y no un especificador de clase de almacenamiento, su vinculación es externa.

y para objetos con enlace externo ,

Un objeto cuyo identificador se declara sin el especificador de clase de almacenamiento _Thread_local , y con un enlace externo o interno o con el especificador de clase de almacenamiento static , tiene una duración de almacenamiento estática . Su duración es la ejecución completa del programa y su valor almacenado se inicializa solo una vez, antes del inicio del programa.


En un programa teórico, solo C-standards, lo es.

En la práctica, generalmente es más complicado.

En Linux, AFAIK, el núcleo carga su imagen vinculada en un espacio de direcciones reservado y primero llama al enlazador dinámico que especifica la imagen ejecutable (a menos que el ejecutable se compile estáticamente, en cuyo caso no hay una parte de enlace dinámico).

El enlazador dinámico puede cargar bibliotecas dependientes, como la biblioteca C. Estas bibliotecas pueden registrar su propio código de inicio, y usted también puede hacerlo (en gcc principalmente a través de __attribute__((constructorr)) ). (El código de inicio proporcionado por el usuario es especialmente necesario para C ++, donde necesita ejecutar algún código de inicio en C ++ globales que tengan constructores).

Luego, el enlazador llama al punto de entrada de su imagen, que comienza de manera predeterminada (los enlazadores le permiten elegir un nombre diferente si quiere cavar esa profundidad), que es provisto por defecto por la biblioteca C _start inicializa la biblioteca C y continúa llamando a main .

En cualquier caso, inicializaciones globales simples como int x = 42; debe compilarse y vincularse en su ejecutable y luego ser cargado por el sistema operativo (en lugar de su código) de una vez, como parte de la carga de la imagen del proceso, de modo que no es necesario el código de inicialización proporcionado por el usuario para tales variables.


La variable global y, en general, los objetos de la duración del almacenamiento estático se inicializan conceptualmente antes de la ejecución del programa.

C11 (N1570) 5.1.2 / 1 Entornos de ejecución :

Todos los objetos con duración de almacenamiento estática deberán inicializarse (establecerse en sus valores iniciales) antes del inicio del programa.

Dado un entorno alojado, la función main se designa como un punto de entrada requerido , donde comienza la ejecución del programa. Puede estar en una de dos formas:

int main(void) int main(int argc, char* argv[])

donde los nombres de los parámetros no tienen que ser los mismos que los de arriba (es solo una convención).

Para un entorno autónomo, el punto de entrada está definido por la implementación , es por eso que a veces puede encontrar void main() o cualquier forma diferente en implementaciones C para dispositivos integrados.

C11 (N1570) 5.1.2.1/1 Ambiente independiente:

En un entorno independiente (en el que la ejecución del programa C puede tener lugar sin ningún beneficio de un sistema operativo), el nombre y el tipo de la función llamada al inicio del programa están definidos por la implementación.


Sí, cuando declara que se le asigna una memoria variable en tiempo de compilación hasta y a menos que no use el segmento de pila (asignando memoria al puntero), es decir, asignación dinámica que ocurre en tiempo de ejecución. Pero desde que global obtuvo su memoria de la sección de segmento de datos de la variable RAM, se asigna memoria en tiempo de compilación. Espero que esto ayude.


Si utiliza turbo c watch, encontrará que se declara el primer global y luego la ejecución de los inicios principales que están en el segmento de datos de tiempo de compilación (dando memoria a variables globales y estáticas) se inicializa con 0. Entonces, la asignación no es posible pero se produce una declaración en tiempo de compilación


main no es un punto de partida del programa. El punto de partida del programa es el punto de entrada del programa, que en la mayoría de los casos es transparente para un programador en C. Por lo general, se denota con el símbolo _start y se define en un código de inicio escrito en ensamblaje o precompilado en una biblioteca de inicialización de tiempo de ejecución de C (como crt0.o ). Es responsable de la inicialización de bajo nivel de las cosas que está tomando como dadas, como inicializar las variables estáticas no inicializadas a ceros. Una vez hecho, llama a un símbolo predefinido main , que es el main que conoce.