Red de conocimiento informático - Material del sitio web - ¿Cuál es la diferencia entre archivos de encabezado y archivos fuente?

¿Cuál es la diferencia entre archivos de encabezado y archivos fuente?

Esencialmente no existe diferencia entre archivos de encabezado y archivos fuente. ? Es simplemente general: los archivos con el sufijo ?.h son archivos de encabezado que contienen declaraciones de funciones, definiciones de macros, definiciones de estructuras, etc. Los archivos con el sufijo ?.c son archivos fuente que contienen implementación de funciones, definiciones de variables, etc. Y no importa qué sufijo sea, pero el compilador tomará ciertas acciones en archivos con ciertos sufijos de forma predeterminada. Es un buen estilo de programación escribirlo en dos archivos separados.

En pocas palabras, para comprender la diferencia entre archivos C y archivos de encabezado (es decir, .h), primero debe comprender el proceso de trabajo del compilador. En términos generales, el compilador hará el trabajo. siguientes procesos:

①Etapa de preprocesamiento

②Etapa de análisis léxico y sintáctico

③Etapa de compilación, primero compílelo en declaraciones de ensamblaje puras y luego ensamblelas en el CPU Se utilizan códigos binarios relevantes para generar cada archivo de destino (archivo .obj)

④ En la etapa de conexión, se genera el posicionamiento de dirección absoluta de cada segmento de código en cada archivo de destino para generar un archivo ejecutable relacionado con una plataforma específica, por supuesto, al final, también puede usar objcopy para generar código binario puro, lo que significa que se elimina la información del formato del archivo. (Generar archivo .exe)

3. Por ejemplo, defina una declaración de función en aaa.h, luego cree aaa.c en el mismo directorio que aaa.h y defínala en aaa.c Para implementar. esta función, #incluir este aaa.h en el archivo .c donde se encuentra la función principal. ¿Entonces puedo usar esta función? Cuando se ejecute main, encontrará el archivo aaa.c que define esta función. Esto se debe a que la función principal es el punto de entrada del programa C/C estándar, y el compilador primero encontrará el archivo donde se encuentra la función. Supongamos que cuando el compilador compila myproj.c (que contiene main()) y descubre que incluye mylib.h (que declara la función void test()), entonces el compilador seguirá la ruta preestablecida (Incluir la lista de rutas y la ruta donde se encuentra el archivo de código) busque un archivo de implementación con el mismo nombre (extensión .cpp o .c, en este caso mylib.c), si se encuentra el archivo, y busque la función en él (void en este caso test ()), continúe con la compilación; si el archivo de implementación no se puede encontrar en el directorio especificado, o el código de implementación no se encuentra en este archivo y en los archivos de inclusión posteriores, se devolverá un error de compilación. De hecho, el proceso de inclusión está completamente bien. "Verlo como" es un proceso de empalme de archivos. La declaración y la implementación se escriben en el archivo de encabezado y en el archivo C respectivamente, o ambas se escriben en el archivo de encabezado al mismo tiempo, y en teoría no existe una diferencia esencial. Lo anterior es el llamado método dinámico. Para el método estático, básicamente todos los compiladores C/C admiten un método de enlace llamado Static Link, que es el llamado enlace estático. De esta forma, lo único que tenemos que hacer es escribir archivos de cabecera (a.h, b.h,...) que contengan declaraciones de funciones, clases, etc., y sus correspondientes archivos de implementación (a.cpp, b.cpp,... ), el compilador lo compilará en un archivo de biblioteca estática (a.lib, b.lib,...). En el proceso de reutilización de código posterior, solo necesitamos proporcionar el archivo de encabezado correspondiente (.h) y el archivo de biblioteca correspondiente (.lib), y se puede utilizar el código anterior. En comparación con el método dinámico, la ventaja del método estático es que oculta el código de implementación, es decir, la "interfaz está expuesta al mundo exterior y el código de implementación es invisible" defendido en C. Propicio para el reenvío de archivos de la biblioteca.