¿Los archivos de encabezado son código fuente?
No existe ninguna diferencia de naturaleza entre los archivos de encabezado y los archivos fuente. Solo en circunstancias normales: los archivos con el sufijo? .h son archivos de encabezado, incluidas declaraciones de funciones, definiciones de macros, definiciones de estructuras, etc. Los archivos con el sufijo ?.c son archivos fuente, que incluyen implementación de funciones, definiciones de variables, etc. No importa cuál sea el sufijo. Lo importante es que el compilador tomará acciones específicas de forma predeterminada para archivos con ciertos sufijos. Es un buen estilo de programación escribir 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á lo siguiente. procesos:
① Etapa de preprocesamiento
② Etapa de análisis léxico y sintáctico
③ Etapa de compilación, primero compilada en declaraciones compiladas puras y luego compilada en declaraciones relacionadas con la CPU código binario. En la fase de compilación, primero compile en declaraciones ensambladoras puras, luego compile en código binario relacionado con la CPU y genere archivos de destino (archivos .obj)
④Fase de enlace, ubique cada código en cada archivo de destino La dirección absoluta del segmento y genera un archivo ejecutable específico de la plataforma. El último paso es, por supuesto, utilizar objcopy para generar código binario puro, es decir, eliminar la información del formato del archivo. (Generar archivo .exe)
3. Supongamos que define una declaración de función en aaa.h y luego crea aaa.c en el mismo directorio que aaa.h, aaa.c define la implementación de función, y luego #include aaa.h en la función principal del archivo .c, entonces puede usar la función. Cuando se ejecuta main, encontrará el archivo aaa.c que define la función. Esto se debe a que la función principal es un punto de entrada del programa C/C estándar y el compilador primero encontrará el archivo donde se encuentra la función. Supongamos que el compilador compila myproj.c (que contiene main()) y descubre que contiene mylib.h (declarando la función void test()), entonces el compilador seguirá la ruta predefinida (incluye la ruta y la lista de rutas del archivo de código) para encontrar Archivo de implementación con el mismo nombre (extensión .cpp o .c), en este caso mylib.h es la función principal. mylib.c en este ejemplo), si se encuentra el archivo y el código de implementación de la función (void test() en este ejemplo), la compilación continúa si el archivo de implementación no se encuentra en el directorio especificado, o en If; el código de implementación en el archivo incluido no se encuentra en este archivo y en los archivos posteriores, se devolverá un error de compilación. De hecho, el proceso de inclusión puede "ver" como 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, o ambos se escriben en el archivo de encabezado, 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 enlace estático. De esta manera, solo necesitamos escribir archivos de encabezado (a.h, b.h...) y archivos de implementación correspondientes (a.h, b.h...) que contengan declaraciones de funciones, clases, etc., y el compilador compilará los archivos en una biblioteca estática. archivos (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) para usar el código anterior. En comparación con el método dinámico, la ventaja del método estático es que el código de implementación está oculto, es decir, la "interfaz es externa y el código de implementación es invisible" defendida por C. Esto también facilita el reenvío de archivos de la biblioteca.