2009-08-25 10 views
14

Estoy comenzando a cuestionar la utilidad de la palabra clave "extern" que se usa para acceder a variables/funciones en otros módulos (en otros archivos). ¿No estamos haciendo lo mismo cuando utilizamos el preprocesador #include para importar un archivo de encabezado con variables/funciones, prototipos o definiciones de funciones/variables?¿Cuál es la diferencia entre usar extern y #including header files?

Respuesta

17

extern es necesario porque declara que el símbolo existe y es de cierto tipo, y no asigna almacenamiento para él.

Si lo hace:

int foo; 

En un archivo de cabecera que se comparte entre varios archivos de origen, recibirá un error de vinculador porque cada fuente tendría su propia copia de foo creado y el enlazador no podrán para resolver el símbolo

En cambio, si tiene:

extern int foo; 

En la cabecera, sería declarar un símbolo que se define en otra parte de cada archivo fuente.

una (y sólo una) archivo fuente contendría

int foo; 

que crea una única instancia de foo para el vinculador resolver.

+2

¿Aún así no puede acceder a int foo sin declarar con extern int foo, siempre que incluya el archivo de encabezado que contiene su definición? –

+2

Como mencionó jcopenha, #include simplemente inserta el texto del archivo incluido en el archivo fuente; el compilador no está realmente al tanto de los archivos incluidos y no los trata especialmente. Entonces, si tienes A.c, B.c y C.c, cada uno con "int foo" y los vinculas, ¿cómo resuelves foo? Existe en 3 lugares diferentes. Extern solo significa que el símbolo existe en otro lugar. Puedes usarlo, pero alguien más es responsable de crearlo. – Michael

+0

Encontrará que para las funciones donde solo hay una instancia de foo_fun() los programas con módulos que llaman a foo_fun() funcionarán con o sin el extern. Entonces, en esos casos, debe tratar de ser claro al respecto. Cuando ingresas a una variable global compartida, debes ser muy claro, algunos compiladores lo resuelven y otros no. –

2

No. El #include es un comando de preprocesador que dice "poner todo el texto de este otro archivo aquí". Entonces, todas las funciones y variables en el archivo incluido se definen en el archivo actual.

Cuestiones relacionadas