Articulo de referencia

Incluir directiva

Una directiva include indica a un procesador de archivos de texto que reemplace el texto de la directiva con el contenido de un archivo específico. La inclusión puede tener un c...

Una directiva include indica a un procesador de archivos de texto que reemplace el texto de la directiva con el contenido de un archivo específico.

La inclusión puede tener un carácter lógico. El procesador puede simplemente procesar el contenido del archivo incluido en la ubicación de la directiva sin crear un archivo combinado.

Los distintos procesadores pueden usar sintaxis diferentes. El preprocesador de C (utilizado con C , C++ y en otros contextos) define una directiva include como una línea que comienza #includey va seguida de una especificación de archivo. COBOL define una directiva include indicada por copypara incluir un copybook .

Generalmente, en C/C++ la directiva include se usa para incluir un archivo de cabecera , pero puede incluir cualquier archivo. Aunque es relativamente poco común, a veces se usa para incluir un archivo de cuerpo, como un archivo .c .

La directiva include permite la encapsulación y la reutilización . Diferentes partes de un sistema pueden agruparse lógicamente, pero dependen unas de otras mediante la inclusión de archivos. C y C++ están diseñados para aprovechar include y, al mismo tiempo, optimizar el tiempo de compilación al permitir la declaración separada de la implementación . La información incluida puede minimizarse a solo las declaraciones.

Dado que la inclusión directa del contenido de un archivo tiene inconvenientes significativos, como un exceso de código repetitivo o desconocimiento de la sintaxis del tipo/lenguaje, los lenguajes más recientes se han diseñado sin una directiva include. Lenguajes como Go , Python y Haskell admiten la modularización mediante una instrucción import , que hace que el compilador/intérprete cargue un módulo, resolviendo el código a través del módulo vinculado, no mediante la inclusión de texto. Los lenguajes compilados, como Rust y D , simplemente vinculan todos los archivos objeto en tiempo de compilación. De manera similar, C++ también introdujo importla importación de módulos C++ , que utiliza archivos .pcm para almacenar como intermedios de forma similar a como funcionan los encabezados precompilados . Aunque Java tiene y C# tiene , estos no son lo mismo que una directiva include. De hecho, en estos lenguajes, las clases se cargan bajo demanda mediante un cargador de clases y se puede acceder a ellas simplemente calificando completamente la clase con sus espacios de nombres . Las instrucciones import en estos lenguajes se utilizan solo para agregar una clase al ámbito actual.importusing

Aunque C# tiene la capacidad de usar algunas directivas de preprocesador similares a las del preprocesador de C, no contiene la #includedirectiva.

Soporte de idiomas

C/C++

Tanto C como C++ (anterior a C++20) se utilizan normalmente con el preprocesador de C, que reemplaza una #includelínea de directiva con el contenido del archivo especificado. La ruta del archivo se encierra entre comillas dobles (p. ej., "Header.h" ) o entre corchetes angulares (p. ej., <Header.h> ). [ 1 ] Algunos preprocesadores localizan el archivo de inclusión de forma diferente según los delimitadores; tratan una ruta entre comillas dobles como relativa al archivo de inclusión y una ruta entre corchetes angulares como ubicada en uno de los directorios de la ruta de búsqueda del sistema configurada. [ 2 ]

Ejemplos de declaraciones:

// Incluye el archivo de cabecera estándar de C 'stdio.h'; probablemente sea un archivo con ese nombre #include <stdio.h> // Incluye el archivo de cabecera estándar de C++ 'vector'; puede o no ser un archivo #include <vector> // Incluye un archivo de cabecera personalizado llamado 'MyHeader.h' #include "MyHeader.h"

La directiva include permite el desarrollo de bibliotecas de código que:

  • ayuda a garantizar que todos utilicen la misma versión de una definición de diseño de datos o código de procedimiento en todo un programa.
  • Permite realizar referencias cruzadas fácilmente sobre dónde se utilizan los componentes en un sistema.
  • Programas de cambio centralizados/generales de fácil uso cuando sea necesario (solo se debe editar un archivo).
  • Ahorra tiempo reutilizando diseños de datos.

Las directivas include no admiten patrones de comodines , por lo que, por ejemplo, no incluirían todos los archivos *.h en el directorio actual.#include"*.h"

Ejemplo

Dados dos archivos fuente en C. Uno define una función add()y el otro la utiliza. Sin usar una directiva include, el archivo que la utiliza puede declarar la función localmente como un prototipo de función :

#pragma una vezentero sumar ( entero , entero );int triple ( int x ) { return add ( x , add ( x , x )); }

Una desventaja de este enfoque es que el prototipo de la función debe estar presente en cada archivo que la llama add(). Otra desventaja es que si la firma cambia, entonces cada archivo que la consume debe actualizarse. Colocar el prototipo en un único archivo separado evita estos problemas. Si el prototipo se mueve a un archivo de encabezado Add.h , el archivo fuente que lo utiliza queda así:

#incluir "Add.h"int triple ( int x ) { return add ( x , add ( x , x )); }

Archivo de cabecera

En C y C++, un archivo de cabecera es un archivo de código fuente que permite a los programadores compartir y reutilizar las declaraciones de un código base , a menudo implementadas en grupos separados y lógicamente relacionados.

Un archivo de cabecera declara elementos de programación como funciones , clases , variables y macros de preprocesador . Un archivo de cabecera permite al programador utilizar elementos de programación en varios archivos de cuerpo basándose en la declaración común en el archivo de cabecera. Las declaraciones en un archivo de cabecera permiten que los archivos de cuerpo utilicen implementaciones sin incluir directamente el código de implementación. La cabecera mantiene la interfaz separada de la implementación . [ 3 ]

Pueden producirse errores de compilación si varios archivos de cabecera incluyen el mismo archivo. Una solución es evitar incluir archivos en los archivos de cabecera , lo que podría requerir directivas de inclusión excesivas en los archivos del cuerpo. Otra solución es utilizar una protección de inclusión en cada archivo de cabecera. [ 4 ]

La biblioteca estándar de C se declara como una colección de archivos de cabecera. La biblioteca estándar de C++ es similar, pero las declaraciones pueden ser proporcionadas por el compilador sin necesidad de leer un archivo real.

Los archivos de cabecera estándar de C se nombran con la extensión de archivo .h , como en . Por lo general, los archivos de cabecera personalizados de C tienen la misma extensión. Los archivos de cabecera personalizados de C++ tienden a tener una mayor variedad de extensiones, incluidas .hpp , .hh , .h++ y .hxx , así como la ambigua .h .#include<stdio.h>

Un nombre de biblioteca estándar de C++ entre corchetes angulares (es decir, <vector> ) hace que las declaraciones se incluyan, pero puede que no provengan de un archivo. [ 5 ]

Unidad de cabecera

Desde C++20 , C++ admite la semántica de importación a través de la unidad de cabecera , es decir, unidades de traducción separadas sintetizadas a partir de una cabecera. [ 6 ] Están pensadas para usarse como un estado de transición hacia la adopción total de módulos.

importA partir de C++26 , no es una directiva del preprocesador. Por lo tanto, el preprocesador de C no la gestiona. importNo copia el código en un archivo como #include, sino que enlaza la unidad de traducción durante la compilación.

Ejemplo:

import < stdio . h > ; // admitir esto es opcional import < vector > ; // admitir esto es obligatorio por el estándar export import "MyHeader.h" ;

Se proporcionan unidades de cabecera para todas las cabeceras de la biblioteca estándar de C++. [ 7 ]

Módulos

Desde C++20, se introdujeron los módulosimport y se importan usando . Estos tienen la misma semántica para importar que las unidades de cabecera, pero tienen un control más preciso de las exportaciones. Desde C++26 , el preprocesador no los maneja en absoluto. Deben estar marcados moduley cada símbolo debe estar marcado exporto estar en un exportbloque para que sea accesible mediante importación. La semántica de una importinstrucción es:

exportar opcionalmente importar nombre_del_módulo;

A partir de C++23 , la biblioteca estándar de C++ se puede importar como un módulo escribiendo .importstd;

// importa la biblioteca estándar de C++ import std ;// importa un módulo llamado "acme.project.math.BigInteger" import acme . project . math . BigInteger ;// importa un módulo llamado "wikipedia.util.logging.Logger" y lo reexporta // cualquier archivo que importe este módulo importará transitivamente wikipedia.util.logging.Logger export import wikipedia . util . logging . Logger ;

Empotrar

Añadida en C23 y C++26 , la #embeddirectiva es similar a la #includedirectiva pero es más apropiada para incluir/incrustar recursos binarios en el código fuente.

constexpr char ICON_DISPLAY_DATA [] = { #embed "art.png" };// especifique cualquier tipo que pueda inicializarse a partir de expresiones constantes enteras lo hará constexpr char RESET_BLOB [] = { #embed "data.bin" };// los atributos funcionan igual de bien alignas ( 8 ) constexpr char ALIGNED_DATA_STRING [] = { #embed "attributes.xml" };int main () { return #embed </dev/urandom> limit(1) ; }

Objetivo-C

Objective-C , al igual que C, también utiliza archivos de cabecera y tiene una #includedirectiva. Sin embargo, también tiene una #importdirectiva, que se comporta igual que #include, con la única diferencia de que #importgarantiza que la inclusión del archivo nunca ocurrirá más de una vez, sin el uso de guardas #include o #pragma once .

#importar <Foundation/Foundation.h> #importar "MyClass.h"

La #importdirectiva Objective-C no debe confundirse con la importinstrucción en C++ (que importa un módulo), ni con la directiva de Microsoft Visual C++#import , que importa una biblioteca de tipos. [ 8 ]

COBOL

COBOL (y también RPG IV ) permite a los programadores copiar copybooks en el código fuente del programa , lo que es similar a la inclusión pero permite reemplazar texto. La palabra clave de COBOL para la inclusión es COPY, y el reemplazo se realiza usando la REPLACING ... BY ...cláusula. Una directiva include ha estado presente en COBOL desde COBOL 60, pero cambió de la original INCLUDE[ 9 ] a COPYen 1968. [ 10 ]

Fortran

Fortran no requiere archivos de cabecera propiamente dichos . Sin embargo, Fortran 90 y versiones posteriores cuentan con dos características relacionadas: includesentencias y módulos. Las primeras permiten compartir un archivo común que contiene interfaces de procedimientos, de forma similar a una cabecera de C, aunque la especificación de una interfaz no es obligatoria para todas las variantes de procedimientos de Fortran. Este enfoque no es común; en su lugar, los procedimientos suelen agruparse en módulos que pueden referenciarse mediante una usesentencia en otras regiones del código. Para los módulos, el compilador genera automáticamente la información de la interfaz de tipo cabecera, que normalmente se coloca en archivos de módulo independientes, si bien algunos compiladores la han incluido directamente en los archivos objeto. La especificación del lenguaje no exige la creación de archivos adicionales, aunque las interfaces de procedimientos de los módulos se propagan casi universalmente de esta manera.

Haskell

El lenguaje Haskell , que puede usar el preprocesador de C escribiendo {-# LANGUAGE CPP #-}, tiene acceso a la #includedirectiva.

Pascal

La mayoría de los compiladores de Pascal admiten la directiva de compilador $ior , en la que la directiva or sigue inmediatamente al inicio de un bloque de comentarios en forma de$include$i$include

  • {$i ''filename.pas''}
  • (*$i ''filename.inc''*)
  • {$include ''filename.inc''}
  • (*include ''filename.pas''*)

Donde la directiva $i/ $Io $include/ $INCLUDEno distingue entre mayúsculas y minúsculas , y filename.pas o filename.inc es el nombre del archivo que se va a incluir. (Ha sido 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 la recursión ilimitada, limitan la invocación de un archivo de inclusión a un cierto número, 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, solo uno a la vez.

PHP

En PHP , la includedirectiva hace que se incluya y evalúe otro archivo PHP. [ 11 ] Comandos similares son require, que en caso de no poder incluir producirá una excepción fatal y detendrá el script, [ 12 ] y include_oncey require_once, que impiden que un archivo se incluya o requiera de nuevo si ya se ha incluido o requerido, evitando el problema de doble inclusión de C.

Óxido

Rust tiene la include!macro, que se comporta esencialmente igual que #includeen C. Analiza el elemento como una expresión o como un elemento, dependiendo del contexto. [ 13 ]

¡Incluir! ( "generated_code.rs" );fn main () { // ... usar elementos de generated_code.rs }

Sin embargo, a diferencia de C, este no es el método habitual para separar e incluir código. En su lugar, Rust utiliza módulos , que preservan los espacios de nombres y la encapsulación.

Rust también admite una include_str!macro que permite incluir un archivo completo y almacenarlo en una cadena. [ 14 ] De manera similar, existe una include_bytes!macro.

let my_str : & ' static str = include_str! ( "spanish.in" ); let bytes : & ' static [ u8 ] = include_bytes! ( "spanish.in" );

Otros idiomas

Otros idiomas notables con una directiva include:

  • include...( Fortran , MASM )
  • <!--#include ...-->(HTML SSI )
  • var...=require("...");(JavaScript con CommonJS )
  • <%@include...%>( JSP )
  • %include ...( PL/I )
  • /COPY QCPYLESRC,QBC(RPG IV el primer argumento es el nombre del archivo, el segundo argumento es el libro de copias)
  • local...=require("...")( Lua )

Los lenguajes modernos (por ejemplo, Haskell y Java ) tienden a evitar la directiva include, prefiriendo módulos y semántica de importación/exportación. Algunos de estos lenguajes (como Java y C# ) no utilizan declaraciones anticipadas y, en su lugar, los identificadores se reconocen automáticamente a partir de los archivos fuente y se leen directamente de los símbolos de la biblioteca dinámica (normalmente referenciados con directivas importo using).

Véase también

Referencias

  1. Estándar C11, 6.10.2 Inclusión de archivos fuente, págs. 164–165
  2. Stallman, Richard M. (julio de 1992). "El preprocesador de C" (PDF) . Archivado del original (PDF) el 4 de septiembre de 2012. Recuperado el 19 de febrero de 2014 .
  3. Alan Griffiths (2005). "Separando la interfaz y la implementación en C++" . ACCU . Consultado el 7 de mayo de 2013 .
  4. Pike, Rob (21 de febrero de 1989), Notas sobre programación en C , archivo de documentos Cat-v , consultado el 9 de diciembre de 2011.
  5. Estándar C11, 7.1.2 Encabezados estándar, pág. 181, nota al pie 182: "Un encabezado no es necesariamente un archivo fuente, ni las<y>en los nombres de los encabezados son necesariamente nombres de archivos fuente válidos.
  6. "Módulos de fusión - P1103R3" (PDF) .
  7. "P1502R1 - Unidades de cabecera de la biblioteca estándar para C++20" .
  8. Microsoft Corporation. "Directiva #import (C++)" . learn.microsoft.com . Microsoft Learn . Consultado el 6 de diciembre de 2025 .
  9. "Especificaciones iniciales de COBOL para un lenguaje orientado a negocios comunes" (PDF) . Departamento de Defensa . Abril de 1960. pág. IX-9. Archivado del original (PDF) el 12 de febrero de 2014. Consultado el 11 de febrero de 2014 . 
  10. "La instrucción COPY". CODASYL COBOL Journal of Development 1968. Julio de 1969. LCCN 73601243 . 
  11. "incluir" . php.net . The PHP Group . Consultado el 20 de febrero de 2014 .
  12. "require" . php.net . The PHP Group . Consultado el 20 de febrero de 2014 .
  13. "incluir en std - Rust" . doc.rust-lang.org . Consultado el 8 de septiembre de 2025 .
  14. "include_str en std - Rust" . doc.rust-lang.org . Consultado el 4 de julio de 2025 .
  • Organización de archivos de código (los posibles inconvenientes y las directrices para el uso de archivos de cabecera en C++)
  • Reglas de inclusión de archivos de cabecera de C++