112-Análisis de uso externo en lenguaje C

externo

En el lenguaje C, el modificador extern se usa antes de la declaración de una variable o función para indicar "esta variable / función se define en otro lugar y debe citarse aquí". Además, extern también se puede utilizar para la designación de enlaces.

1. La declaración de variable externa modificada.
Por ejemplo, si el archivo ac necesita hacer referencia a la variable int p en bc, puede declarar extern int p en ac, y luego puede hacer referencia a la variable p. Las variables a las que otros módulos pueden hacer referencia con el modificador extern suelen ser variables globales. Otro punto importante es que extern int p se puede colocar en cualquier lugar de ac. Por ejemplo, puede declarar extern int p al comienzo de la definición de función fun en ac, y luego puede hacer referencia a la variable p, pero esta P solo puede ser referenciado en el alcance de la función fun

2. declaración de función modificada externa.
En esencia, no hay diferencia entre variables y funciones. El nombre de la función es un puntero al comienzo del bloque binario de la función. Si el archivo ac necesita hacer referencia a una función en bc, por ejemplo, el prototipo en bc es int fun (int m), entonces puede declarar extern int fun (int m) en ac, y luego puede usar fun to do cualquier cosa. Al igual que la declaración de variables, extern int fun (int m) se puede colocar en cualquier lugar de ac, no necesariamente en el alcance del archivo de ac. Para referencias a funciones en otros módulos, el método más común es incluir los archivos de encabezado de estas declaraciones de función.

¿Cuál es la diferencia entre usar extern e incluir archivos de encabezado para hacer referencia a funciones?
¡El método de cotización de Extern es mucho más limpio que incluir archivos de encabezado! El método de usar extern es sencillo. Use extern para declarar a qué función desea hacer referencia. Una ventaja obvia de esto es que acelerará el preprocesamiento del programa y ahorrará tiempo. En el proceso de compilación de grandes programas en C, esta diferencia es muy obvia.

problema comun

Pregunta 1 Una matriz se define en un archivo fuente: char a [6]; En otro archivo, se declara con la siguiente declaración: extern char * a; Disculpe, ¿es esto posible?

No , le dirá el acceso ilegal cuando el programa se esté ejecutando. La razón es que un puntero al tipo T no es equivalente a una matriz de tipo T. extern char a declara una variable de puntero en lugar de una matriz de caracteres, por lo que es diferente de la definición real, lo que resulta en un acceso ilegal en tiempo de ejecución. La declaración debe cambiarse a extern char a [].
El análisis de ejemplo es el siguiente, si a [] = "abcd", entonces la variable externa a = 0x61626364 (valor de código ASCII de abcd), a obviamente no tiene sentido. Obviamente, el espacio al que apunta a (0x61626364) no tiene sentido, y es fácil parecer un acceso ilegal a la memoria.
Esto nos recuerda que debemos corresponder estrictamente al formato de declaración al usar extern. En la programación real, estos errores no son infrecuentes.
Extern se usa a menudo en declaraciones de variables. Usted
declara una variable global en el archivo .c. Si se va a hacer referencia a esta variable global, póngala en
.hy declare con extern.

Pregunta 2 Cuando el proveedor de la función modifica unilateralmente el prototipo de la función, si el usuario continúa usando la declaración externa original sin saberlo, el compilador no reportará un error durante la compilación. Sin embargo, en el proceso de operación, debido a que hay menos o más parámetros de entrada, a menudo se convierte en un error del sistema ¿Cómo se debe resolver esta situación?

El proveedor proporciona la declaración de la interfaz externa en su propio xxx_pub.h, y luego el llamador incluye el archivo de encabezado, eliminando así el paso externo. Para evitar este tipo de error.

Pregunta 3 A menudo es común que extern se coloque delante de una función y se convierta en parte de la declaración de la función Entonces, ¿qué papel juega la palabra clave extern del lenguaje C en la declaración de la función?

Si la palabra clave extern se incluye en la declaración de una función, solo implica que la función puede estar definida en otros archivos fuente y no tiene ningún otro efecto. Es decir, no hay una diferencia obvia entre las siguientes dos declaraciones de función:
extern int f (); e int f ();
  Por supuesto, todavía existe tal utilidad, que es reemplazar include "* .h" en el programa para declarar funciones En algunos proyectos complejos, estoy más acostumbrado a agregar modificaciones externas antes de todas las declaraciones de funciones.

Pregunta 4 Cuando se utilizan funciones C en un entorno C ++, a menudo sucede que el compilador no puede encontrar la definición de la función C en el módulo obj, lo que provoca una falla en el enlace ¿Cómo resolver esta situación?

Para resolver el problema del polimorfismo de la función cuando se compila el lenguaje C ++, el nombre de la función y los parámetros se combinan para generar un nombre de función intermedio, mientras que el lenguaje C no. Por lo tanto, la función correspondiente no se puede encontrar al vincular. C las funciones deben estar vinculadas con extern "C" Esto le dice al compilador, por favor, mantenga mi nombre y no me genere nombres de funciones intermedias para vincular.

#ifdef __cplusplus
#if __cplusplus
extern "C"{
    
    
 #endif
 #endif /* __cplusplus */ 
	 …
		  …
		   //.h文件结束的地方
 #ifdef __cplusplus
 #if __cplusplus
}
#endif
#endif /* __cplusplus */ 

Supongo que te gusta

Origin blog.csdn.net/LINZEYU666/article/details/111588170
Recomendado
Clasificación