extern y el compilador XC8 C

2

Quizás 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 encabezado keypad.h tengo:

signed char keypadGetPressedKeyLabel(void);

Pensé que tendría que usar extern , es decir:

extern signed char keypadGetPressedKeyLabel(void);

El proyecto se construye sin extern . Y funciona. ¿Podría esto debido al hecho de que keypad.c y keypad.h son parte del proyecto? Estoy usando MPLABX.

    
pregunta James Rogers

4 respuestas

2

extern no es estrictamente necesario para los prototipos de funciones en archivos .h, ya sea que la función se use o no en uno o muchos archivos .c diferentes en su proyecto.
Si tienes extern int foo(void); o simplemente int foo(void); en tu .h, tu compilador leerá es como un prototipo de función de cualquier manera.

Es necesario para las variables globales, ya que, a diferencia de las funciones, no tienen prototipos.
Entonces, si tiene un int thing; en un archivo .c y quiere usarlo en otro archivo .c, entonces necesitará un extern int thing; para decirle al compilador que existe "en algún lugar" en su proyecto.

    
respondido por el brhans
2

Las funciones son extern de forma predeterminada en C ; por eso funciona sin la palabra clave.

    
respondido por el m.Alin
1

extern es realmente un signo para el vinculador, de que el símbolo está definido en un archivo objeto diferente. Como solo parece tener un archivo de objeto, no hay ninguna diferencia si está allí o no.

    
respondido por el user207421
1

extern está en gran parte obsoleto para las funciones en otras UC en muchos de los compiladores más pequeños y simples. Si un símbolo no se encuentra localmente, se buscará en otras UC y bibliotecas. Usted proporciona un prototipo de función, pero no la función real, en la CU donde desea usarla.

Sin embargo, extern es necesario para las variables que se comparten entre las CU. No puede definir un prototipo para una variable, por lo que la palabra clave extern en esta situación debe usarse para crear la variable equivalente de un prototipo de función.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas