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
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.
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.
- 1. ¿Cuál es la diferencia entre usar WorkflowInvoker y WorkflowApplication?
- 2. ¿Cuál es la diferencia entre usar MD5.Create y MD5CryptoServiceProvider?
- 3. Cuál es la diferencia entre $ y jQuery
- 4. ¿Cuál es la diferencia entre Copy Bundle Resources y Copy Files para Xcode build phases?
- 5. ¿Cuál es la diferencia entre "system32 \ java.exe" y "Program Files \ Java \ jdk1.6.0_33 \ bin \ java.exe"?
- 6. Diferencia entre extern int a; extern int a = 42;
- 7. ¿Cuál es la diferencia entre @ y $ y% en MSBuild?
- 8. ¿Cuál es la diferencia entre {0} y ""?
- 9. Cuál es la diferencia entre = y: =
- 10. ¿Cuál es la diferencia entre .ToString (+) y ""
- 11. Cuál es la diferencia entre $ (...) y `...`
- 12. ¿cuál es la diferencia entre:.! y: r !?
- 13. ¿Cuál es la diferencia entre ".equals" y "=="?
- 14. ¿Cuál es la diferencia entre dict() y {}?
- 15. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 16. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 17. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 18. ¿Cuál es la diferencia entre + = y = +?
- 19. ¿Cuál es la diferencia entre " " y ""?
- 20. ¿Cuál es la diferencia entre "hacer" y "hacer todo"?
- 21. ¿Cuál es la diferencia entre volátil y externo?
- 22. ¿Cuál es la diferencia entre * .bat y * .cmd?
- 23. ¿cuál es la diferencia entre text/javascript y aplicación/javascript
- 24. ¿Cuál es la diferencia entre LinkedList y ArrayList, y cuándo usar cuál?
- 25. ¿Cuál es la diferencia entre JApplet y Applet, y cuál debería usar?
- 26. ¿Cuál es la diferencia entre uno mismo y la ventana?
- 27. ¿Cuál es la diferencia de usar addEventListener?
- 28. OpenGL (ES) - ¿Cuál es la diferencia entre frustum y orto?
- 29. En Linq, ¿cuál es la diferencia entre .FirstOrDefault y .SingleOrDefault
- 30. ¿Cuál es la diferencia entre Reader y InputStream?
¿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? –
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
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. –