De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda

Muchos lenguajes de programación y otros archivos de computadora tienen una directiva , a menudo llamada include(a veces copyo import), que hace que el contenido de un segundo archivo se inserte en el archivo original. Estos archivos incluidos se denominan cuadernos oarchivo de encabezado s . A menudo se utilizan para definir el diseño físico de los datos del programa, fragmentos de código de procedimiento y / o declaraciones de reenvío mientras se promueve la encapsulación y la reutilización del código.

Propósito [ editar ]

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

  • asegurarse de que todos usen la misma versión de una definición de diseño de datos o código de procedimiento en todo un programa,
  • Fácil referencia cruzada donde los componentes se utilizan en un sistema,
  • cambiar fácilmente los programas cuando sea necesario (solo se debe editar un archivo maestro, en lugar de modificar cada instancia, se usa un tipo de datos idéntico o se llama a una función ), y
  • Ahorre tiempo al no tener que codificar diseños de datos extensos (menor, pero útil).

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 tenemos una función adden un archivo, que luego se declara (con un prototipo de función ) y luego se hace referencia a ella en un segundo archivo fuente de la siguiente manera:

int  agregar ( int ,  int );int  triple ( int  x ) {  return  add ( x ,  add ( x ,  x )); }

Un inconveniente de este método es que el prototipo debe estar presente en todos los archivos que utilizan la función. Otro inconveniente es que si se cambia el tipo de retorno o los argumentos de la función, estos prototipos deberán actualizarse. Poner el prototipo en un solo archivo separado evita estos problemas. Suponiendo que el prototipo se mueva al archivo add.h, el segundo archivo fuente puede convertirse en:

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

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

Soporte de idiomas [ editar ]

C / C ++ [ editar ]

En C y C ++ , la #include directiva del 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: <>); [1] tenga en cuenta que un encabezado no necesita ser un archivo fuente. [2] 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 que correspondan a los archivos: en C ++ los encabezados estándar generalmente se identifican con palabras, como "vector", por lo tanto, #include <vector>mientras que en C los encabezados estándar tienen identificadores en forma de nombres de archivo con una extensión ".h", como en#include <stdio.h>. Un "archivo de origen" puede ser cualquier archivo, con un nombre de cualquier forma, pero normalmente se denomina con una extensión ".h" y se denomina "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.

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 el formulario de paréntesis angulares busque archivos fuente en un directorio estándar del sistema (o un 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 con comillas no busca en un directorio del sistema estándar, solo busca en rutas locales o específicas del proyecto. [3]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 archivos es principalmente un tecnicismo de implementación, y se usa 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>  // Incluya el contenido del encabezado estándar 'stdio.h' (probablemente un archivo 'stdio.h').#include  <vector>  // Incluya el contenido del encabezado estándar 'vector' (probablemente un archivo 'vector.h').#include  "user_defined.h"  // Incluya el contenido del archivo 'user_defined.h'.

En C y C ++, pueden surgir problemas si dos (o más) archivos incluyen ambos, a su vez, el mismo tercer archivo. Una solución es evitar que los archivos de inclusión incluyan cualquier otro archivo, posiblemente requiriendo que el programador agregue manualmente directivas de inclusión adicionales al archivo original. Otra solución es utilizar protectores incluidos . [4]

COBOL [ editar ]

COBOL (y también RPG IV ) permite a los programadores copiar libros de texto 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ó de la original INCLUDE[5] a COPY1968. [6]

Fortran [ editar ]

Fortran no requiere archivos de encabezado per se . Sin embargo, Fortran 90 y versiones 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, muy parecido a un encabezado C, aunque la especificación de una interfaz no es necesaria para todas las variedades de procedimientos de Fortran. Este enfoque no se usa comúnmente; en su lugar, los procedimientos generalmente se agrupan en módulos que luego se pueden referenciar con unusedeclaración dentro de otras regiones del código. En el caso de los módulos, el compilador genera automáticamente la información de interfaz de tipo 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 archivos adicionales, aunque las interfaces de procedimiento de módulo se propagan casi universalmente de esta manera.

Pascal [ editar ]

La mayoría de los compiladores de Pascal admiten la directiva del compilador $io $include, en la que la directiva $io $includesigue inmediatamente al comienzo de un bloque de comentarios en forma de

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

Donde la directiva $io $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 archivos de inclusión de pascal con la extensión .inc pero esto no es obligatorio). Algunos compiladores, para evitar la recursividad de crock , limitan la invocación de un archivo de inclusión a un cierto número, prohíben la invocación a sí mismo oa cualquier archivo abierto actualmente o está limitado 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 [ editar ]

En PHP , la includedirectiva hace que se incluya y evalúe otro archivo PHP. [7] Los comandos similares son require, que si no se incluyen producirán una excepción fatal y detendrán el script, [8] y include_oncey require_once, que hacen que un archivo no se incluya o no se requiera nuevamente si ya se ha incluido o requerido, evitando El problema de la doble inclusión de C.

Otros idiomas [ editar ]

Hay muchas formas de la directiva de inclusión, como:

  • #include ...( C )
  • include ...( Fortran , MASM )
  • <!--#include ... -->(HTML SSI )
  • import ...;( Java )
  • import ... from ...( JavaScript como en ECMAScript )
  • var ... = require("...")(JavaScript con CommonJS )
  • <%@ include ... %>( JSP )
  • {$I ...}( UCSD Pascal , Turbo Pascal )
  • %include ...( PL / I )
  • import ...( Python )
  • /COPY QCPYLESRC,QBC (RPG IV: el primer argumento es el nombre del archivo, el segundo argumento es el libro de copias)
  • use ...;( Óxido )

Los lenguajes modernos (por ejemplo, Haskell y Java ) tienden a evitar los cuadernos o las 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 de reenvío y, en cambio, los identificadores se reconocen automáticamente de los archivos fuente y se leen directamente de los símbolos de biblioteca dinámica (normalmente referenciados con importo usingdirectivas), lo que significa que los archivos de encabezado no son necesarios.

Ver también [ editar ]

  • Subrutina
  • fuente (comando) y punto (Unix)
  • Transclusion
  • Programación modular
  • Incluir vulnerabilidad
  • El lado del servidor incluye (SSI)
  • Inclusión de archivos remotos
  • Regla de una definición (ODR)
  • Interfaz de programación de aplicaciones (API)
  • Lenguaje de definición de interfaz (IDL)
  • #pragma once
  • Archivo de implementación de clase
  • Solo encabezado
  • Construcción de unidad

Referencias [ editar ]

  1. ^ Estándar C11, inclusión de archivo fuente 6.10.2, págs. 164-165
  2. ^ Estándar C11, 7.1.2 Encabezados estándar, p. 181, nota 182 al pie de página: "Un encabezado no es necesariamente un archivo fuente, ni lassecuencias delimitadas<y>en los nombres de encabezado son necesariamente nombres de archivo fuente válidos.
  3. ^ Stallman, Richard M. (julio de 1992). "El preprocesador C" (PDF) . Archivado desde el original (PDF) el 4 de septiembre de 2012 . Consultado el 19 de febrero de 2014 .
  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. ^ "Especificaciones iniciales de COBOL para un lenguaje orientado a negocios común" (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 .
  6. ^ "La declaración COPY". CODASYL COBOL Revista de desarrollo 1968 . Julio de 1969. LCCN 73601243 . 
  7. ^ "incluir" . php.net . El Grupo PHP . Consultado el 20 de febrero de 2014 .
  8. ^ "requerir" . php.net . El Grupo PHP . Consultado el 20 de febrero de 2014 .

Enlaces externos [ editar ]

  • Organización de archivos de código (las posibles dificultades y pautas para el uso de archivos de encabezado en C ++)
  • Reglas de inclusión de archivos de encabezado de C ++