Debe distinguir entre dos conceptos separados: definición de función y declaración de símbolo. "extern" es un modificador de vinculación, una pista para el compilador acerca de dónde se define el símbolo al que se hace referencia después (la pista es "no aquí").
Si yo escribo
extern int i;
en el alcance del archivo (fuera de un bloque de funciones) en un archivo C, entonces usted dice "la variable puede estar definida en otro lugar".
extern int f() {return 0;}
es tanto una declaración de la función f como una definición de la función f. La definición en este caso anula la externa.
extern int f();
int f() {return 0;}
es primero una declaración, seguida de la definición.
El uso de extern
es incorrecto si desea declarar y definir simultáneamente una variable de alcance de archivo. Por ejemplo,
extern int i = 4;
dará un error o advertencia, dependiendo del compilador.
El uso de extern
es útil si desea explícitamente evitar la definición de una variable.
Dejame explicar:
Digamos que el archivo ac contiene:
#include "a.h"
int i = 2;
int f() { i++; return i;}
El archivo ah incluye:
extern int i;
int f(void);
y el archivo bc contiene:
#include <stdio.h>
#include "a.h"
int main(void){
printf("%d\n", f());
return 0;
}
El extern en el encabezado es útil, porque le dice al compilador durante la fase de enlace, "esto es una declaración, y no una definición". Si elimino la línea en ac que define i, le asigna espacio y le asigna un valor, el programa no podrá compilarse con una referencia indefinida. Esto le dice al desarrollador que se ha referido a una variable, pero que aún no la ha definido. Si, por otro lado, omito la palabra clave "extern" y elimino la int i = 2
línea, el programa aún se compila; se definirá con un valor predeterminado de 0.
Las variables de alcance de archivo se definen implícitamente con un valor predeterminado de 0 o NULL si no les asigna explícitamente un valor, a diferencia de las variables de alcance de bloque que declara en la parte superior de una función. La palabra clave externa evita esta definición implícita y, por lo tanto, ayuda a evitar errores.
Para las funciones, en las declaraciones de funciones, la palabra clave es de hecho redundante. Las declaraciones de funciones no tienen una definición implícita.