stringtranslate.com

Directiva de inclusión

Muchos lenguajes de programación y otros archivos de computadora tienen una directiva , a menudo llamada include, importo copy, que hace que el contenido del archivo especificado se inserte en el archivo original. Estos archivos incluidos se denominanArchivos de encabezado olibros de copias. A menudo se utilizan para definir la disposición física de los datos del programa, fragmentos de código procedimental y/odeclaraciones futuras,al tiempo que promuevenla encapsulacióny la reutilización del código o los datos.

Archivos de encabezado

En programación informática , 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 suelen contener declaraciones 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 solo archivo de encabezado, que luego otro código puede incluir 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 más nuevos (como Java y C# ) no utilizan declaraciones adelantadas; los identificadores se reconocen automáticamente a partir de los archivos fuente y se leen directamente desde los símbolos de bibliotecas dinámicas . Esto significa que no se necesitan archivos de encabezado.

Objetivo

La includedirectiva permite desarrollar bibliotecas de código que ayuden a:

Ejemplo

Una situación de ejemplo que se beneficia del uso de una directiva include es cuando se hace referencia a funciones en un archivo diferente. Supongamos que hay un archivo fuente de Cadd que contiene una función , 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 ) { devolver suma ( x , suma ( x , x )); }      

Una desventaja de este enfoque es que el prototipo de la función debe estar presente en todos los archivos que utilizan la función. Otra desventaja es que si se modifican el tipo de retorno o los argumentos de la función, todos estos prototipos deberán actualizarse. Poner el prototipo en un solo archivo separado evita estos problemas. Suponiendo que el prototipo se mueve al archivo add.h, el segundo archivo fuente puede convertirse en:

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

Ahora, cada vez que se compila el código, los últimos prototipos de funciones add.hse incluirán en los archivos que los utilizan, evitando posibles errores.

Soporte de idiomas

C/C++

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 nombrado (si está incluido entre comillas: "") o el encabezado nombrado (si está incluido entre corchetes angulares: <>); [2] un encabezado no necesita ser un archivo fuente. [3] La inclusión continúa recursivamente 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 archivo con una extensión ".h", como en . Un "archivo fuente" puede ser cualquier archivo, con un nombre de cualquier formato, pero lo más común es que se le nombre con una extensión ".h" y se le llame "archivo de encabezado" (a veces ".hpp" o ".hh" para distinguir los encabezados de C++), 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 usan otras extensiones.#include <vector>#include <stdio.h>

Estas dos formas de #includedirectiva pueden determinar qué encabezado o archivo fuente incluir de una manera definida por la implementación. En la práctica, lo que se suele hacer es que la forma de corchetes 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 comandos, en una variable de entorno o en un Makefile u otro archivo de compilación), mientras que la forma con 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 de corchetes angulares también se puede utilizar para especificar inclusiones específicas del proyecto, pero esto se considera una forma deficiente. 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 "user_defined.h"  // Incluye el contenido del archivo 'user_defined.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 usar protecciones de inclusión . [5]

Desde C++20 , los encabezados también se pueden importar como unidades de encabezado , es decir, unidades de traducción independientes sintetizadas a partir de un encabezado. [6] Están pensados ​​para usarse junto con módulos . La sintaxis utilizada en ese caso es

exportar opcional importar nombre-de-encabezado;

Por 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 de forma similar a los archivos de encabezado, pero también permite reemplazar cierto texto en ellos con otro 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

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í mismo 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

Existen muchas formas de la directiva include, como por ejemplo:

Los lenguajes modernos (por ejemplo, Haskell y Java ) tienden a evitar los copybooks o los include, 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 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), lo que significa que no se necesitan archivos de encabezado.

Véase también

Referencias

  1. ^ Alan Griffiths (2005). "Separación de la interfaz y la implementación en C++". ACCU . Consultado el 7 de mayo de 2013 .
  2. ^ Norma C11, 6.10.2 Inclusión de archivos fuente, págs. 164-165
  3. ^ 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.
  4. ^ 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 .
  5. ^ 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
  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 .

Enlaces externos