Saltar al contenido

Efectos de la palabra clave extern en funciones C

Es importante entender el código de forma correcta previamente a adaptarlo a tu proyecto si ttienes algo que aportar puedes dejarlo en la sección de comentarios.

Solución:

Tenemos dos archivos, foo.cy bar.c.

Aquí está foo.c

#include 

volatile unsigned int stop_now = 0;
extern void bar_function(void);

int main(void)

  while (1) 
     bar_function();
     stop_now = 1;
  
  return 0;

Ahora, aquí está bar.c

#include 

extern volatile unsigned int stop_now;

void bar_function(void)

   if (! stop_now) 
      printf("Hello, world!n");
      sleep(30);
   

Como puede ver, no tenemos un encabezado compartido entre foo.cy bar.c, sin embargo, bar.c necesita algo declarado en foo.c cuando está vinculado, y foo.c necesita una función de bar.c cuando está vinculado.

Al usar ‘extern’, le está diciendo al compilador que todo lo que sigue se encontrará (nostatic) en el momento del enlace; no reserve nada para él en el pase actual, ya que se encontrará más tarde. Las funciones y variables se tratan por igual a este respecto.

Es muy útil si necesita compartir algo global entre módulos y no quiere ponerlo / inicializarlo en un encabezado.

Técnicamente, cada función en un encabezado público de biblioteca es ‘externa’, sin embargo, etiquetarlas como tales tiene muy poco o ningún beneficio, dependiendo del compilador. La mayoría de los compiladores pueden averiguarlo por sí mismos. Como puede ver, esas funciones están definidas en otro lugar.

En el ejemplo anterior, main () imprimiría hola mundo solo una vez, pero continuaría ingresando bar_function (). También tenga en cuenta que bar_function () no volverá en este ejemplo (ya que es solo un ejemplo simple). Imagínese que stop_now se modifica cuando se da servicio a una señal (por lo tanto, volátil) si esto no parece lo suficientemente práctico.

Los externos son muy útiles para cosas como manejadores de señales, un mutex que no desea poner en un encabezado o estructura, etc. La mayoría de los compiladores optimizarán para asegurarse de que no reservan memoria para objetos externos, ya que saben que Lo estaré reservando en el módulo donde se define el objeto. Sin embargo, nuevamente, no tiene mucho sentido especificarlo con compiladores modernos cuando se crean prototipos de funciones públicas.

Espero que ayude 🙂

Por lo que recuerdo el estándar, todas las declaraciones de función se consideran “extern” por defecto, por lo que no es necesario especificarlo explícitamente.

Eso no hace que esta palabra clave sea inútil, ya que también se puede usar con variables (y en ese caso, es la única solución para resolver problemas de vinculación). Pero con las funciones, sí, es opcional.

Debe distinguir entre dos conceptos separados: definición de función y declaración de símbolo. “extern” es un modificador de enlace, una pista al compilador sobre dónde se define el símbolo al que se hace referencia posteriormente (la pista es “no aquí”).

Si escribo

extern int i;

en el alcance del archivo (fuera de un bloque de funciones) en un archivo C, entonces está diciendo “la variable puede definirse 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. En este caso, la definición anula lo externo.

extern int f();
int f() return 0;

es primero una declaración, seguida de la definición.

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.

Uso de extern es útil si desea evitar explícitamente 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 
#include "a.h"

int main(void)
    printf("%dn", 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, no una definición”. Si elimino la línea en ac que define i, le asigno espacio y le asigno un valor, el programa debería fallar al compilar con una referencia indefinida. Esto le dice al desarrollador que se ha referido a una variable, pero aún no la ha definido. Si, por el contrario, 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 extern evita esta definición implícita y, por lo tanto, ayuda a evitar errores.

Para funciones, en declaraciones de función, la palabra clave es realmente redundante. Las declaraciones de funciones no tienen una definición implícita.

Acuérdate de que te concedemos valorar este escrito si encontraste tu impasse .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *