Explicación detallada de archivos de encabezado y archivos de origen en C ++
1. Modo de compilación C ++
En general, en un programa C ++, solo hay dos tipos de archivos: archivo .cpp y archivo .h. Entre ellos, el archivo .cpp se llama archivo fuente C ++, y el código fuente de C ++ se coloca en él; mientras que el archivo .h se llama el archivo de encabezado C ++, y el código fuente de C ++ se coloca en él.
El lenguaje C ++ admite "compilación separada". En otras palabras, todo el contenido de un programa se puede dividir en diferentes partes y colocarse en diferentes archivos .cpp. Las cosas en el archivo .cpp son relativamente independientes. Al compilar (compilar), no necesita comunicarse con otros archivos. Solo necesita vincular con otros archivos de destino después de compilarlo en el archivo de destino. Por ejemplo, una función global "void a () {}" se define en el archivo A.CPP, y esta función debe llamarse en el archivo b.cpp. Aun así, los archivos A.CPP y B.CPP no necesitan conocer la existencia de los demás, pero pueden compilarlos por separado. Después de compilarlos en el archivo de destino, enlacelos y se puede ejecutar todo el programa.
¿Cómo se logra esto? Desde la perspectiva de los programas de escritura, es muy simple. En el archivo B.CPP, antes de llamar a la función "nula a ()", declare la función "nulo a ();" primero. Esto se debe a que el compilador generará una tabla de símbolos al compilar B.CPP. Los símbolos como "Void a ()" que no se pueden ver se almacenarán en esta tabla. Al vincular nuevamente, el compilador buscará la definición de este símbolo en otros archivos de objetos. Una vez encontrado, el programa se puede generar sin problemas.
Tenga en cuenta que hay dos conceptos mencionados aquí, uno es "definición" y el otro es "declaración". En pocas palabras, "definición" significa describir un símbolo de una manera completa y completa: ya sea una variable o una función, qué tipo devuelve, qué parámetros necesita, etc. "Declaración" solo declara la existencia de este símbolo, es decir, le dice al compilador que este símbolo se define en otros archivos. Lo usaré primero. Cuando vincule, vaya a otro lugar para averiguar qué es. Al definir, debe definir un símbolo (variable o función) completamente según la sintaxis de C ++, y al declarar, solo necesita escribir el prototipo de este símbolo. Cabe señalar que un símbolo se puede declarar varias veces durante todo el programa, pero debe definirse solo una vez. Imagínense, si hay dos definiciones diferentes de un símbolo, ¿a quién debería escuchar el compilador?
Este mecanismo aporta muchos beneficios a los programadores C ++, y también conduce a un método de programas de escritura. Considere que si hay una función muy comúnmente utilizada "void f () {}" que se llamará en muchos archivos .cpp en todo el programa, entonces solo necesitamos definir esta función en un archivo y declarar esta función en otros archivos. Es fácil tratar una función, y solo significa una oración para declararla. Sin embargo, ¿qué pasa si hay demasiadas funciones, como un montón de funciones matemáticas, hay cientos de ellas? ¿Puede cada programador asegurarse de escribir y escribir con precisión todas las funciones en forma de ellas?
2. ¿Qué es un archivo de encabezado?
Obviamente, la respuesta es imposible. Pero hay una manera muy sencilla de ayudar a los programadores a guardar la molestia de recordar tantos prototipos de funciones: podemos escribir todas las declaraciones de declaración de cientos de funciones primero y ponerlos en un archivo. Cuando el programador los necesita, copie todas estas cosas en su código fuente.