Tal vez no entiendo completamente extern
. Con el compilador XC8 C, parece que puedo escapar sin usarlo.
En el archivo keypad.c
tengo una función signed char keypadGetPressedKeyLabel(void)
. En el archivo de cabecera keypad.h
tengo:
signed char keypadGetPressedKeyLabel(void);
Pensé que tendría que usar extern
, es decir:
extern signed char keypadGetPressedKeyLabel(void);
El proyecto se compila sin extern
. Y funciona. ¿Podría esto deberse al hecho de que keypad.c
y keypad.h
son todos parte del proyecto? Estoy usando MPLABX.
extern
no es estrictamente necesario para prototipos de funciones en archivos .h, ya sea que la función se use o no en uno o varios archivos .c diferentes en su proyecto.
Ya sea que tenga extern int foo(void);
o solo int foo(void);
en su .h, su compilador leerá como un prototipo de función de cualquier manera.
Sin embargo, es necesario para las variables globales, ya que, a diferencia de las funciones, no tienen prototipos.
Entonces, si tiene un int thing;
archivo .c en un archivo y desea usarlo en otro archivo .c, necesitará un extern int thing;
para decirle al compilador que existe 'en algún lugar' de su proyecto.
Las funciones son externas por defecto en C ; por eso funciona sin la palabra clave.
extern
es realmente una señal para el enlazador, que el símbolo está definido en un archivo de objeto diferente. Como parece que solo tiene un archivo de objeto, no importa si está allí o no.
extern
está en gran parte obsoleto para funciones en otras CU en muchos de los compiladores más pequeños y simples. Si un símbolo no se encuentra localmente, se buscará en otras CU y bibliotecas. Proporciona un prototipo de función, pero no la función real, en la CU donde desea usarla.
Sin embargo, extern
se requiere para las variables que se comparten entre CU. No puede definir un prototipo para una variable, por lo que la extern
palabra clave en esta situación debe usarse para crear la variable equivalente a un prototipo de función.
Ignacio Vázquez-Abrams
keypad.h
?