programa - crear archivos de cabecera en c
¿Qué significan las extensiones de archivo.c y.h para C? (6)
Todo está en el título; Super-simple, reconozco, pero es muy difícil buscar cosas sintácticas en cualquier lugar.
Estos son dos archivos de biblioteca que estoy copiando desde CS50.net , y me pregunto por qué tienen dos extensiones diferentes.
El archivo .c es el archivo de origen y .h es el archivo de encabezado .
En realidad no son archivos de biblioteca. Solo son archivos fuente. Como dijo Stefano, el archivo .c es el archivo de origen C que realmente usa / define la fuente real de lo que simplemente se describe en el archivo .h , el archivo de encabezado. El archivo de encabezado generalmente describe todos los prototipos de funciones y las estructuras que se usarán en el archivo fuente real. Piense en ello como una referencia / apéndice. Esto es evidente al ver el archivo de encabezado, como verá :) Entonces, cuando desea usar algo que estaba escrito en estos archivos fuente, #include
incluye el archivo de encabezado, que contiene la información que el compilador necesitará saber .
Los archivos .c son archivos fuente que se compilarán. Los archivos .h se utilizan para exponer la API de un programa a cualquier otra parte de ese programa u otro programa en el que está creando una biblioteca.
Por ejemplo, el programa PizzaDelivery podría tener 1 archivo .c con el programa principal y 1 archivo .c con funciones de utilidad. Ahora, para que la parte principal del programa pueda usar las funciones de utilidad, debe exponer la API, a través del prototipo de función, en un archivo .h, este archivo .h está incluido en el archivo .c principal.
Por supuesto, no hay nada que diga que la extensión de un archivo de encabezado debe ser .h
y la extensión de un archivo de origen C debe ser .c
. Estas son convenciones útiles.
E:/Temp> type my.interface
#ifndef MY_INTERFACE_INCLUDED
#define MYBUFFERSIZE 8
#define MY_INTERFACE_INCLUDED
#endif
E:/Temp> type my.source
#include <stdio.h>
#include "my.interface"
int main(void) {
char x[MYBUFFERSIZE] = {0};
x[0] = ''a'';
puts(x);
return 0;
}
E:/Temp> gcc -x c my.source -o my.exe
E:/Temp> my
a
archivo .c: c (donde la acción real es, en general)
.h: archivo de cabecera (para ser incluido con una directiva preprocesador #include
). Contiene elementos que normalmente se consideran compartidos con otras partes de tu código, como prototipos de funciones, cosas definidas, declaración externa para variables globales (¡oh, el horror!) Y cosas por el estilo.
Técnicamente, podrías poner todo en un solo archivo. Un programa completo de C. millones de líneas Pero nosotros los humanos tendemos a organizar las cosas. Entonces usted crea diferentes archivos C, cada uno con funciones particulares. Eso es todo lindo y limpio. Entonces, de repente, se da cuenta de que una declaración que tiene en un archivo C dado debería existir también en otro archivo C. Entonces los duplicarás. Lo mejor es, por lo tanto, extraer la declaración y ponerla en un archivo común, que es el .h
Por ejemplo, en cs50.h encontrará lo que se denomina "declaraciones directas" de sus funciones. Una declaración directa es una forma rápida de decirle al compilador cómo debe llamarse una función (por ejemplo, qué parametros de entrada) y qué devuelve, para que pueda realizar una comprobación adecuada (por ejemplo, si llama a una función con un número de parámetros incorrecto, se quejará).
Otro ejemplo. Supongamos que escribe un archivo .c que contiene una función que realiza la coincidencia de expresión regular. Desea que su función acepte la expresión regular, la cadena que coincida y un parámetro que indique si la comparación debe ser insensible a las mayúsculas y minúsculas.
en el .c pondrás por lo tanto
bool matches(string regexp, string s, int flags) { the code }
Ahora suponga que quiere pasar los siguientes indicadores:
0: si la búsqueda es sensible a mayúsculas y minúsculas
1: si la búsqueda no distingue entre mayúsculas y minúsculas
Y desea mantenerse abierto a nuevas banderas, por lo que no puso un booleano. jugar con números es difícil, entonces puedes definir nombres útiles para estas banderas
#define MATCH_CASE_SENSITIVE 0
#define MATCH_CASE_INSENSITIVE 1
Esta información entra en .h, porque si algún programa quiere usar estas etiquetas, no tiene forma de conocerlas a menos que incluya la información. Por supuesto, puedes ponerlos en la .c, pero luego deberías incluir el código .c (¡todo!), Lo cual es una pérdida de tiempo y una fuente de problemas.
.c : ''C'' source code
.h : Header file
Por lo general, los archivos .c
contienen la implementación, y los archivos .h
contienen la "interfaz" de una implementación.