extern y el compilador XC8 C

Tal vez no entiendo completamente extern. Con el compilador XC8 C, parece que puedo escapar sin usarlo.

En el archivo keypad.ctengo una función signed char keypadGetPressedKeyLabel(void). En el archivo de cabecera keypad.htengo:

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.cy keypad.hson todos parte del proyecto? Estoy usando MPLABX.

¿ Hay otros archivos usando keypad.h?

Respuestas (4)

externno 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.

Correcto. Además, puede incluir la inicialización solo en la definición de la variable, por ejemplo, int a = 0; es un error repetir esto nuevamente en una declaración externa, por ejemplo, extern int a = 0; // error

Las funciones son externas por defecto en C ; por eso funciona sin la palabra clave.

Esta es realmente la respuesta correcta, pero creo que también se beneficiaría de una breve explicación de lo que realmente significa extern.
Grandes respuestas; El compilador PICs XC8 utiliza la búsqueda externa de archivos externos, no solo como una declaración global.

externes 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.

externestá 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, externse requiere para las variables que se comparten entre CU. No puede definir un prototipo para una variable, por lo que la externpalabra clave en esta situación debe usarse para crear la variable equivalente a un prototipo de función.