why variable used resueltos memoria functions example estatica ejercicios ejemplos dinamicos dinamica arreglos are c function static main

variable - ¿Por qué main() no puede declararse como estática en C?



variable static c# (2)

Debido a que vincula los archivos de inicio a su programa, que contiene (generalmente) código de ensamblador que llama a su principal. Si main estuviera estático, ese código no podría llamar a main.

external linkage significa que otras llamadas translation-units pueden ver su símbolo declarado extern en su propia unidad de traducción. Entonces, su main es extern, y tendrá una entrada en su tabla de símbolos de unidades de traducción que indica su dirección. Otras unidades de traducción podrán saltar a esa dirección cuando quieran llamar a main.

static linkage significa que su símbolo es estrictamente unidad de traducción local. Esto significa que otras translation units no podrán ver ese símbolo. Por lo tanto, los símbolos con vinculación estática pueden ocurrir en diferentes unidades de traducción varias veces, y no chocarán entre sí porque son locales.

Editar : Generalmente, los archivos generados por el compilador de las unidades de traducción son específicos de ese compilador en particular. Para gcc on linux, a menudo se usa el formato de objeto ELF. Puede ver su tabla de símbolos usando readelf -sW <file>.o (archivo de prueba simple a continuación):

test.c

void bar(void); static int foo(void) { return 1; } int main(void) { bar(); return foo(); }

Aquí está la salida de readelf:

Symbol table ''.symtab'' contains 10 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 FILE LOCAL DEFAULT ABS test.c 2: 00000000 0 SECTION LOCAL DEFAULT 1 3: 00000000 0 SECTION LOCAL DEFAULT 3 4: 00000000 0 SECTION LOCAL DEFAULT 4 5: 00000000 10 FUNC LOCAL DEFAULT 1 foo 6: 00000000 0 SECTION LOCAL DEFAULT 6 7: 00000000 0 SECTION LOCAL DEFAULT 5 8: 0000000a 36 FUNC GLOBAL DEFAULT 1 main 9: 00000000 0 NOTYPE GLOBAL DEFAULT UND bar

Verá la función principal, y una función foo estática, llamada por main. También hay una función llamada que no está definida en el archivo, pero que está definida en otro archivo objeto. Como el archivo objeto aún no se había enlazado, las funciones aún no tienen asignadas las direcciones finales. Después del enlace final, estos se organizarán en el ejecutable y tendrán direcciones asignadas. El archivo objeto tiene entradas para llamadas a funciones aún no definidas, de modo que cuando el archivo está vinculado, esas instrucciones de llamada pueden tener las direcciones finales almacenadas ( readelf -r <file>.o ):

Relocation section ''.rel.text'' at offset 0x308 contains 1 entries: Offset Info Type Sym.Value Sym. Name 0000001c 00000902 R_386_PC32 00000000 bar

¿Por qué main debe declararse como si tuviera un enlace externo?

¿Por qué no debería ser estático?

¿Qué se entiende por vinculación externa?


El verdadero punto de partida del código está enterrado en la biblioteca C runtime. Esta biblioteca de tiempo de ejecución llama a su rutina main (). Para que el vinculador pueda conectar la llamada C RTL con su función main (), debe estar visible fuera del archivo.

La vinculación externa es simplemente esto: significa que el nombre en cuestión es visible como parte de las exportaciones del archivo objeto. El trabajo del vinculador es unir todas las importaciones y exportaciones para que no haya importaciones pendientes.