C Archivos de cabecera
Un archivo de cabecera es un archivo con la extensión.h.h, que contiene declaraciones de funciones de C y definiciones de macros, referenciado y compartido por múltiples archivos fuente. Hay dos tipos de archivos de cabecera: los escritos por el programador y los incluidos con el compilador.
Para usar archivos de cabecera en un programa, se necesita usar la directiva de preprocesamiento de C#includepara referenciarlo. Antes ya hemos visto elstdio.harchivo de cabecera <stdio.h>, que es un archivo de cabecera incluido con el compilador.
Referenciar un archivo de cabecera equivale a copiar el contenido del archivo de cabecera, pero no copiamos directamente el contenido del archivo de cabecera en el archivo fuente, porque hacerlo es propenso a errores, especialmente cuando el programa está compuesto por múltiples archivos fuente.
Una práctica simple en programas de C o C++: se recomienda escribir todas las constantes, macros, variables globales del sistema y prototipos de funciones en archivos de cabecera, y hacer referencia a estos archivos de cabecera siempre que sea necesario.
Sintaxis para referenciar archivos de cabecera
Usando la directiva de preprocesamiento#includese pueden referenciar archivos de cabecera de usuario y del sistema. Tiene las siguientes dos formas:
#include <file>
Esta forma se usa para referenciar archivos de cabecera del sistema. Busca un archivo llamado file en la lista estándar de directorios del sistema. Al compilar el código fuente, puede anteponer directorios a esta lista mediante la opción -I.
#include "file"
Esta forma se usa para referenciar archivos de cabecera de usuario. Busca un archivo llamado file en el directorio que contiene el archivo actual. Al compilar el código fuente, puede anteponer directorios a esta lista mediante la opción -I.
Operación de referenciar archivos de cabecera
#includeLa directiva indica al preprocesador de C que examine el archivo especificado como entrada. La salida del preprocesador incluye la salida ya generada, la salida generada por el archivo referenciado y#includela salida de texto posterior a la directiva. Por ejemplo, si tiene un archivo de cabecera header.h, como el siguiente:
char *test (void);
y un programa principal que usa el archivo de cabeceraprogram.c, como el siguiente:
int x;
#include "header.h"
int main (void)
{
puts (test ());
}
El compilador verá la siguiente información de código:
int x;
char *test (void);
int main (void)
{
puts (test ());
}
Referenciar un archivo de cabecera solo una vez
Si un archivo de cabecera se referencia dos veces, el compilador procesará el contenido del archivo de cabecera dos veces, lo que producirá errores. Para evitar esta situación, la práctica estándar es colocar todo el contenido del archivo en una sentencia de compilación condicional, como se muestra a continuación:
#ifndef HEADER_FILE #define HEADER_FILE the entire header file file #endif
Esta estructura es lo que comúnmente se llama envoltorio#ifndef. Cuando el archivo de cabecera se referencia de nuevo, la condición es falsa porque HEADER_FILE ya está definido. En este momento, el preprocesador omite todo el contenido del archivo y el compilador lo ignora.
Referencia condicional
A veces es necesario elegir uno de varios archivos de cabecera diferentes para referenciarlo en el programa. Por ejemplo, es necesario especificar parámetros de configuración para diferentes sistemas operativos. Puede lograr esto mediante una serie de condiciones, como se muestra a continuación:
#if SYSTEM_1 # include "system_1.h" #elif SYSTEM_2 # include "system_2.h" #elif SYSTEM_3 ... #endif
Pero cuando hay muchos archivos de cabecera, hacer esto no es apropiado. El preprocesador usa macros para definir el nombre del archivo de cabecera. Esto es lo que se llamareferencia condicional. No se usa el nombre del archivo de cabecera como#includeparámetro directo de #include, solo necesita usar el nombre de la macro en su lugar:
#define SYSTEM_H "system_1.h" ... #include SYSTEM_H
SYSTEM_H se expandirá, y el preprocesador buscará system_1.h, tal como si#includese hubiera escrito originalmente. SYSTEM_H puede ser definido por su Makefile mediante la opción -D.
Archivos de cabecera de la biblioteca estándar
Los archivos de cabecera de la biblioteca estándar de C (Standard Library Header Files) son un conjunto de archivos de cabecera definidos por los estándares ANSI C (también conocido como C89/C90) e ISO C (C99 y C11). Estos archivos de cabecera proporcionan una gran cantidad de funciones, macros y definiciones de tipos para manejar tareas comunes de programación como entrada/salida, operaciones de cadenas, cálculos matemáticos, gestión de memoria, etc.
Los siguientes son algunos archivos de cabecera comunes de la biblioteca estándar de C y sus descripciones funcionales:
| Archivo de cabecera | Descripción funcional |
|---|---|
| <stdio.h> | Biblioteca estándar de entrada/salida, que incluye funciones comoprintf、scanf, etc. |
| <stdlib.h> | Funciones de la biblioteca estándar, que incluyen asignación de memoria, control de programas, etc. |
| <string.h> | Funciones de operación de cadenas, comostrlen、strcpyesperar |
| <math.h> | Biblioteca de funciones matemáticas, comosin、cos、sqrtesperar |
| <time.h> | Funciones de tiempo y fecha, comotime、strftimeesperar |
| <ctype.h> | Funciones de procesamiento de caracteres, comoisalpha、isdigitesperar |
| <limits.h> | Define los valores límite de varios tipos, comoINT_MAXesperar |
| <float.h> | Define los valores límite de los tipos de punto flotante, comoFLT_MAXesperar |
| <assert.h> | Macros de aserciónassert, usadas para comprobaciones en depuración |
| <errno.h> | Define variables de código de errorerrnoy macros relacionadas |
| <stddef.h> | Define tipos y macros de uso general, comosize_t、NULLesperar |
| <signal.h> | Funciones y macros para manejar señales, comosignalesperar |
| <setjmp.h> | Proporciona macros y funciones para saltos no locales |
| <locale.h> | Funciones y macros relacionadas con la localización, comosetlocaleesperar |