Directiva de inclusión

Instrucciones del procesador de archivos de texto para incluir el contenido de un archivo en otro

Una directiva de inclusión instruye a un procesador de archivos de texto a reemplazar el texto de la directiva con el contenido de un archivo específico.

El acto de incluir puede ser de naturaleza lógica. El procesador puede simplemente procesar el contenido del archivo de inclusión en la ubicación de la directiva sin crear un archivo combinado.

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

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

La directiva include puede admitir la encapsulación y la reutilización . Las distintas partes de un sistema se pueden segregar en grupos lógicos y, sin embargo, dependen unas de otras mediante la inclusión de archivos. C y C++ están diseñados para aprovechar la inclusión y, al mismo tiempo, optimizar el tiempo de compilación al permitir que las declaraciones se separen de la implementación . La información incluida se puede minimizar a solo declaraciones.

Como muchos consideran que incluir contenido de archivos tiene inconvenientes importantes, los lenguajes más nuevos se han diseñado sin una directiva include. Lenguajes como Java y C# admiten la modularización a través de un concepto de importación que permite que un módulo utilice los recursos de otro módulo a nivel conceptual; no mediante la inclusión de texto.

Soporte de idiomas

C/C++

Tanto C como C++ se utilizan normalmente con el preprocesador C que reemplaza una #includelínea de directiva con el contenido del archivo especificado. La ruta de un archivo se escribe entre comillas dobles (es decir, "xyz.h") o entre corchetes angulares (es decir, <xyz.h>). [1] Algunos preprocesadores ubican el archivo incluido de forma diferente en función de los delimitadores que lo encierran; tratan una ruta entre comillas dobles como relativa al archivo incluido y una ruta entre corchetes angulares como ubicada en uno de los directorios de la ruta de búsqueda del sistema configurada. [2]

Los ejemplos incluyen declaraciones:

// incluye el encabezado estándar de C 'stdio.h'; probablemente es un archivo con ese nombre #include <stdio.h> // incluye el encabezado estándar de C++ 'vector'; puede o no ser un archivo #include <vector> // incluye un archivo de encabezado personalizado llamado 'user_defined.h' #include "user_defined.h"    

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

  • Asegúrese de que todos utilicen la misma versión de una definición de diseño de datos o código de procedimiento en todo el programa.
  • Realizar fácilmente referencias cruzadas de dónde se utilizan los componentes en un sistema
  • Cambie fácilmente los programas cuando sea necesario (solo se debe editar un archivo)
  • Ahorre tiempo reutilizando diseños de datos

Ejemplo

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

int suma ( int , int ); int triple ( int x ) { return suma ( x , suma ( x , x )); }         

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

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

Archivo de encabezado

En C y C++, un archivo de encabezado es un archivo de código fuente que permite a los programadores separar elementos de una base de código , a menudo en agrupaciones reutilizables y lógicamente relacionadas.

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

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

La biblioteca estándar de C se declara como una colección de archivos de encabezado. La biblioteca estándar de C++ es similar, pero el compilador puede proporcionar las declaraciones sin leer un archivo real.

Los archivos de encabezado estándar de C se nombran con una .h extensión de nombre de archivo , como #include <stdio.h>. Normalmente, los archivos de encabezado de C personalizados tienen la misma extensión. Los archivos de encabezado de C++ personalizados tienden a tener una mayor variedad de extensiones, incluidas .hpp, .h++y .hh.

Un nombre de biblioteca estándar de C++ entre corchetes angulares (por ejemplo, <vector>) da como resultado que se incluyan declaraciones, pero es posible que no sean 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 encabezado , es decir, unidades de traducción independientes sintetizadas a partir de un encabezado. [6] Están pensadas para usarse junto con módulos . La sintaxis utilizada en ese caso es:

exportar opcional importar nombre-de-encabezado;

Ejemplo:

import < stdio . h > ; // admitir esto es opcional import < vector > ; // admitir esto es obligatorio según el estándar export import "user_defined.h" ;      

Se proporcionan unidades de encabezado para todos los encabezados de la biblioteca estándar de C++. [7]

COBOL

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

Fortran

Fortran no requiere archivos de encabezado per se . Sin embargo, Fortran 90 y posteriores tienen dos características relacionadas: includedeclaraciones y módulos. El primero se puede utilizar para compartir un archivo común que contiene interfaces de procedimiento, de forma muy similar a un encabezado de C, aunque la especificación de una interfaz no es necesaria para todas las variedades de procedimientos de Fortran. Este enfoque no se utiliza comúnmente; en cambio, los procedimientos generalmente se agrupan en módulos a los que luego se puede hacer referencia con una usedeclaración dentro de otras regiones de código. Para los módulos, el compilador genera automáticamente la información de la interfaz de tipo de encabezado y, por lo general, se coloca en archivos de módulo separados, aunque algunos compiladores han colocado esta información directamente en archivos de objeto. La especificación del lenguaje en sí no exige la creación de ningún archivo adicional, aunque las interfaces de procedimiento de módulo se propagan casi universalmente de esta manera.

Pascal

La mayoría de los compiladores de Pascal admiten la directiva del compilador $ior $include, en la que la directiva $ior $includesigue 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 $ior $includeno 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 la recursión ilimitada, limitan la invocación de un archivo de inclusión a un cierto número, prohíben la invocación de sí mismos o de cualquier archivo abierto actualmente, 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. [10] Comandos similares son require, que en caso de no incluirse producirá una excepción fatal y detendrá el script, [11] y include_oncey require_once, que evitan que se incluya o requiera nuevamente un archivo si ya se ha incluido o requerido, evitando el problema de doble inclusión de C.

Otros idiomas

Otros idiomas notables con una directiva include:

  • include ...( Fortran , MASM )
  • <!--#include ... -->(HTML- SSI )
  • var ... = require("...")(JavaScript con CommonJS )
  • <%@ include ... %>( JSP )
  • {$I ...}( Pascal de la UCSD , Turbo Pascal )
  • %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("...")( Luna )
  • import ...;( D )

Los lenguajes modernos (por ejemplo, Haskell y Java ) tienden a evitar la construcción de 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 adelantadas y, en su lugar, los identificadores se reconocen automáticamente a partir de los archivos fuente y se leen directamente a partir de símbolos de biblioteca dinámica (normalmente referenciados con directivas importo ).using

Véase también

Referencias

  1. ^ Norma 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 desde el original (PDF) el 4 de septiembre de 2012. Consultado el 19 de febrero de 2014 .
  3. ^ Alan Griffiths (2005). "Separación de 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. ^ Norma C11, 7.1.2 Encabezados estándar, pág. 181, nota al pie 182: "Un encabezado no es necesariamente un archivo fuente, ni las secuencias delimitadas por <y >en los nombres de encabezado son necesariamente nombres de archivos fuente válidos.
  6. ^ "Fusionando módulos - P1103R3" (PDF) .
  7. ^ "P1502R1 - Unidades de encabezado de biblioteca estándar para C++20".
  8. ^ "Especificaciones iniciales de COBOL para un lenguaje común orientado a los negocios" (PDF) . Departamento de Defensa . Abril de 1960. p. IX-9. Archivado desde el original (PDF) el 12 de febrero de 2014 . Consultado el 11 de febrero de 2014 .
  9. ^ "La declaración COPY". Revista CODASYL COBOL de desarrollo 1968. Julio de 1969. LCCN  73601243.
  10. ^ "include". php.net . The PHP Group . Consultado el 20 de febrero de 2014 .
  11. ^ "require". php.net . The PHP Group . Consultado el 20 de febrero de 2014 .
  • Organización de archivos de código (posibles problemas y pautas para usar archivos de encabezado en C++)
  • Reglas de inclusión de archivos de encabezado de C++
Obtenido de "https://es.wikipedia.org/w/index.php?title=Directiva_de_inclusión&oldid=1251905557"