Muchos lenguajes de programación y otros archivos de computadora tienen una directiva , a menudo llamada include
, import
o copy
, que hace que el contenido del archivo especificado se inserte en el archivo original. Estos archivos incluidos se llamanarchivo de encabezado ocuadernos. A menudo se utilizan para definir el diseño físico de los datos del programa, piezas de código de procedimiento y/odeclaraciones directasal mismo tiempo que promuevenla encapsulacióny la reutilización de código o datos.
En programación de computadoras , un archivo de encabezado es un archivo que permite a los programadores separar ciertos elementos del código fuente de un programa en archivos reutilizables. Los archivos de encabezado comúnmente contienen declaraciones directas de clases , subrutinas , variables y otros identificadores . Los programadores que deseen declarar identificadores estandarizados en más de un archivo fuente pueden colocar dichos identificadores en un único archivo de encabezado, que luego puede incluir otro código siempre que se requiera el contenido del encabezado. Esto es para mantener la interfaz en el encabezado separada de la implementación . [1]
La biblioteca estándar de C y la biblioteca estándar de C++ tradicionalmente declaran sus funciones estándar en archivos de encabezado.
Algunos lenguajes compilados creados recientemente (como Java y C# ) no utilizan declaraciones directas; Los identificadores se reconocen automáticamente desde los archivos fuente y se leen directamente desde los símbolos de la biblioteca dinámica . Esto significa que los archivos de encabezado no son necesarios.
La include
directiva permite desarrollar bibliotecas de código que ayudan a:
Una situación de ejemplo que se beneficia del uso de una directiva de inclusión es cuando se hace referencia a funciones en un archivo diferente. Supongamos que hay algún archivo fuente C que contiene una función add
, a la que se hace referencia en un segundo archivo declarando primero su existencia externa y tipo (con un prototipo de función ) de la siguiente manera:
int agregar ( int , int ); int triple ( int x ) { return agregar ( x , agregar ( x , x )); }
Un inconveniente de este enfoque es que el prototipo de función debe estar presente en todos los archivos que utilizan la función. Otro inconveniente es que si se cambian el tipo de retorno o los argumentos de la función, sería necesario actualizar todos estos prototipos. Poner el prototipo en un archivo único e independiente evita estos problemas. Suponiendo que el prototipo se mueva al archivo add.h
, el segundo archivo fuente puede convertirse en:
#incluir "agregar.h" int triple ( int x ) { return agregar ( x , agregar ( x , x )); }
Ahora, cada vez que se compila el código, los últimos prototipos de funciones add.h
se incluirán en los archivos que los utilizan, evitando posibles errores.
En los lenguajes de programación C y C++ , la directiva #include
de preprocesador hace que el compilador reemplace esa línea con el texto completo del contenido del archivo fuente con nombre (si se incluye entre comillas: "") o encabezado con nombre (si se incluye entre corchetes angulares: < >); [2] un encabezado no necesita ser un archivo fuente. [3] La inclusión continúa de forma recursiva en estos contenidos incluidos, hasta un límite de anidamiento definido por la implementación. Los encabezados no necesitan tener nombres correspondientes a archivos: en C++ los encabezados estándar generalmente se identifican con palabras, como "vector", por lo tanto , mientras que en C los encabezados estándar tienen identificadores en forma de nombres de archivos con una extensión ".h", como en . Un "archivo fuente" puede ser cualquier archivo, con un nombre de cualquier forma, pero lo más común es que se nombre con una extensión ".h" y se le llame "archivo de encabezado" (a veces ".hpp" o ".hh" para distinguir C++). encabezados), aunque también se pueden incluir archivos con extensiones .c, .cc y .cpp (particularmente en la técnica de unidad de compilación única ) y, a veces, se utilizan otras extensiones.#include <vector>
#include <stdio.h>
Estas dos formas de #include
directiva pueden determinar qué encabezado o archivo fuente incluir de una manera definida por la implementación. En la práctica, lo que generalmente se hace es que el formulario entre paréntesis angulares busque archivos fuente en un directorio estándar del sistema (o conjunto de directorios) y luego busque archivos fuente en rutas locales o específicas del proyecto (especificadas en la línea de comando, en una variable de entorno, o en un Makefile u otro archivo de compilación), mientras que el formulario entre comillas no busca en un directorio estándar del sistema, solo busca en rutas locales o específicas del proyecto. [4] En caso de que no haya conflicto, la forma entre paréntesis angulares también se puede utilizar para especificar inclusiones específicas del proyecto, pero esto se considera de mala forma. El hecho de que los encabezados no necesariamente correspondan a los archivos es principalmente un tecnicismo de implementación y se utiliza para omitir la extensión .h al incluir encabezados estándar de C++; en el uso común, "encabezado" significa "archivo de encabezado".
Por ejemplo:
#include <stdio.h> // Incluye el contenido del encabezado estándar 'stdio.h' (probablemente un archivo 'stdio.h'). #include <vector> // Incluye el contenido del encabezado estándar 'vector' (probablemente un archivo 'vector.h'). #include "usuario_definido.h" // Incluye el contenido del archivo 'usuario_definido.h'.
En C y C++, pueden surgir problemas si dos (o más) archivos de inclusión contienen el mismo tercer archivo. Una solución es evitar que los archivos de inclusión incluyan otros archivos, lo que posiblemente requiera que el programador agregue manualmente directivas de inclusión adicionales al archivo original. Otra solución es utilizar incluir guardias . [5]
Desde C++20 , los encabezados también se pueden importar como unidades de encabezado , es decir, unidades de traducción separadas sintetizadas a partir de un encabezado. [6] Están destinados a usarse junto con módulos . La sintaxis utilizada en ese caso es
exportar nombre-encabezado de importación opcional ;
Por ejemplo:
importar < stdio . h > ; // admitir esto es opcional import <vector> ; // admitir esto es obligatorio según el estándar export import "user_definido.h" ;
Se proporcionan unidades de encabezado para todos los encabezados de biblioteca estándar de C++. [7]
COBOL (y también RPG IV ) permite a los programadores copiar libros de copias en el código fuente del programa de manera similar a los archivos de encabezado, pero también permite reemplazar cierto texto en ellos con otro texto. La palabra clave COBOL para la inclusión es COPY
y el reemplazo se realiza mediante la REPLACING ... BY ...
cláusula. Una directiva de inclusión ha estado presente en COBOL desde COBOL 60, pero cambió desde el original INCLUDE
[8] hasta COPY
1968. [9]
Fortran no requiere archivos de encabezado per se . Sin embargo, Fortran 90 y posteriores tienen dos características relacionadas: include
declaraciones y módulos. El primero se puede utilizar para compartir un archivo común que contiene interfaces de procedimientos, muy parecido a un encabezado C, aunque no se requiere la especificación de una interfaz para todas las variedades de procedimientos Fortran. Este enfoque no se utiliza habitualmente; en cambio, los procedimientos generalmente se agrupan en módulos a los que luego se puede hacer referencia con una use
declaración dentro de otras regiones del código. Para los módulos, el compilador genera automáticamente información de interfaz de tipo encabezado y generalmente la coloca en archivos de módulo separados, aunque algunos compiladores han colocado esta información directamente en archivos objeto. La especificación del lenguaje en sí no exige la creación de archivos adicionales, aunque las interfaces de procedimientos de módulos se propagan casi universalmente de esta manera.
La mayoría de los compiladores de Pascal admiten la directiva del compilador $i
or $include
, en la que la directiva $i
or $include
sigue inmediatamente al inicio de un bloque de comentarios en forma de
{$i filename.pas}
(*$I filename.inc*)
{$include filename.inc}
(*INCLUDE filename.pas*)
Donde la directiva $i
o $include
no distingue entre mayúsculas y minúsculas y filename.pas o filename.inc es el nombre del archivo que se incluirá. (Ha sido una práctica común nombrar los archivos de inclusión de Pascal con la extensión .inc , pero esto no es obligatorio). Algunos compiladores, para evitar una recursión ilimitada, limitan la invocación de un archivo de inclusión a un número determinado, prohíben invocarse a sí mismo o a cualquier archivo actualmente abierto. , o están limitados a un máximo de un archivo de inclusión a la vez, por ejemplo, un archivo de inclusión no puede incluirse a sí mismo ni a otro archivo. Sin embargo, el programa que incluye otros archivos puede incluir varios, sólo uno a la vez.
En PHP , la include
directiva hace que se incluya y evalúe otro archivo PHP. [10] Comandos similares son require
, que si no se incluyen producirán una excepción fatal y detendrán el script, [11] y include_once
and require_once
, que impiden que un archivo se incluya o se requiera nuevamente si ya se incluyó o se requirió, evitando las C problema de doble inclusión.
Hay muchas formas de directiva de inclusión, como por ejemplo:
include ...
( Fortran , MASM )<!--#include ... -->
( HTMLSSI )import ...;
( Java )import ... from ...
( JavaScript como en ECMAScript )var ... = require("...")
(JavaScript con CommonJS )<%@ include ... %>
( JSP ){$I ...}
( UCSD Pascal , Turbo Pascal )%include ...
( PL/I )import ...
( Pitón )/COPY QCPYLESRC,QBC
(RPG IV: el primer argumento es el nombre del archivo, el segundo argumento es el cuaderno)use ...;
( Óxido )using ...;
( C# )local ... = require("...")
( Lúa )import ...;
( D )Los lenguajes modernos (por ejemplo, Haskell y Java ) tienden a evitar los libros de copia o inclusiones, prefiriendo módulos y sistemas de importación/exportación para el control del espacio de nombres . Algunos de estos lenguajes (como Java y C# ) no utilizan declaraciones directas y, en cambio, los identificadores se reconocen automáticamente desde los archivos fuente y se leen directamente desde los símbolos de la biblioteca dinámica (generalmente referenciados con directivas import
o using
), lo que significa que los archivos de encabezado no son necesarios.
<
necesariamente >
nombres de archivo fuente válidos.