2012-04-13 10 views
9

Estaba solo navegando a través de gcc archivos fuente. En gcc.c, encontré algo así comodeclaración extern y definición de función ambas en el mismo archivo

extern int main (int, char **); 

int 
main (int argc, char **argv) 
{ 

Ahora mi duda es extern es decirle al compilador que la función particular no está en este archivo, pero se puede encontrar en otro lugar del proyecto. Pero aquí, la definición de main es inmediatamente posterior a la declaración extern. ¿Para qué sirve la declaración extern?

Parece que, en este ejemplo específico, extern parece estar comportándose como export que usamos en el montaje, wherin exportamos un símbolo particular exterior del módulo

¿Alguna idea?

Respuesta

13

Usted está malinterpretando la extern - lo hace no indicar al compilador la definición está en otro archivo , simplemente se declara que existe sin definirlo. Está perfectamente bien para que se defina en el mismo archivo .

C tiene el concepto de declaración (declarando que algo existe sin definirlo) y definición (de hecho lo hace existir). Puede declarar tantas veces como desee, pero solo puede definirlo una vez.

Dado que las funciones tienen un enlace externo de forma predeterminada, la palabra clave extern es irrelevante en este caso.

0

Las advertencias probablemente sugerían que faltaba un prototipo de función. Eso es todo.

6

Las funciones son implícitamente externas en C. Incluir extern es solo un recordatorio visual. Nota al margen, para hacer que una función no sea externa, puede usar la palabra clave static.

+0

Sí. Use extern al hacer algo no estándar. – Barry

0

La definición de la función main:

int main(int argc, char **argv) { ... } 

ya es una declaración de prototipos es la sintaxis de la función main con enlace externo. Esto significa una declaración de prototipo con extern justo antes de que la definición main sea redundante.

2

En una declaración de función, extern simplemente declara que la función tiene una vinculación externa, que es la predeterminada; la palabra clave extern es completamente inútil en este contexto, y el efecto es idéntico a una declaración/prototipo normal sin la palabra clave extern.

Cuestiones relacionadas