Espacios de nombres
Variantes
Acciones

Inclusión de archivos fuentes

De cppreference.com
 
 
Lenguaje C++
Temas generales
Control de flujo
Instrucciones de ejecución condicionales
Instrucciones de iteración (bucles)
Declaraciones de salto
Funciones
Declaración de funciones
Declaración de funciones lambda
Especificador inline
Especificación de excepciones(hasta C++20)
Especificador noexcept(C++11)
Excepciones
Espacios de nombres
Tipos
Especificadores
decltype(C++11)
auto(C++11)
alignas(C++11)
Especificadores de duración de almacenamiento
Inicialización
Expresiones
Representaciones alternas
Literales
Booleanos - Enteros - De punto flotante
De carácter - De cadena - nullptr(C++11)
Definidos por el usuario(C++11)
Utilidades
Atributos(C++11)
Tipos
Declaración de typedef
Declaración de alias de tipo(C++11)
Conversiones
Conversiones implícitas - Conversiones explícitas
static_cast - dynamic_cast
const_cast - reinterpret_cast
Asignación de memoria
Clases
Propiedades de funciones específicas de la clase
Funciones miembro especiales
Plantillas
Misceláneos
 
 

Incluye el contenido de otro archivo fuente en el archivo fuente actual, en la línea inmediatamente después de la directiva.

Contenido

[editar]Sintaxis

#include <secuencia-caracteres-h>nueva-línea (1)
#include "secuencia-caracteres-q"nueva-línea (2)
#includetokenes-ppnueva-línea (3)
__has_include("secuencia-caractres-q")
__has_include(<secuencia-caractres-h>)
(4) (desde C++17)
__has_include(literal-de-cadena)
__has_include(<tokenes-pp-h>)
(5) (desde C++17)
1) Busca una cabecera identificada inequívocamente por secuencia-caracteres-h y reemplaza la directiva por todo el contenido de la cabecera.
2) Busca un archivo fuente identificado por secuencia-caracteres-q y reemplaza la directiva por todo el contenido del archivo fuente. Puede retroceder a (1) y tratar la secuencia-caracteres-q como un identificador de cabecera.
3) Si no coinciden (1) ni (2), los tokenes-pp se someterán a un reemplazo de macro. La directiva después del reemplazo se intentará hacer coincidir con (1) o (2) de nuevo.
4) Comprueba si una cabecera o archivo fuente está disponible para su inclusión.
5) Si no coincide (4), los tokenes-pp-h se someterán a un reemplazo de macro. La directiva después del reemplazo se intentará hacer coincidir con (4) de nuevo.
nueva-línea - El carácter nueva línea
secuencia-caracteres-h - Un secuencia de uno o más carácter-h
carácter-h - Cualquier miembro del juego de caracteres de fuente(hasta C++23)juego de caracteres de traducción(desde C++23) excepto nueva línea y >
secuencia-caracteres-q - Una secuencia de uno o más carácter-q
carácter-q - Cualquier miembro del juego de caracteres de fuente(hasta C++23)juego de caracteres de traducción(desde C++23) excepto nueva línea y "
tokenes-pp - Una secuencia de uno o más tokenes de preprocesamiento
literal-de-cadena - Un literal de cadena
tokenes-pp-h - Una secuencia de uno o más tokenes de preprocesamiento excepto >

[editar]Explicación

1) Busca una cabecera identificada únicamente por secuencia-caracteres-h en una secuencia de lugares definidos por la implementación,y provoca el reemplazo de la directiva por todos el contenido de la cabecera. La implementación define como se especifica los lugares de búsqueda o la identificación de las cabeceras.
2) Provoca el reemplazo de esta directiva por todo el contenido del archivo fuente identificado por secuencia-caracteres-q. La implementación define la manera en que se realiza la búsqueda del archivo fuente denominado. Si no se soporta está búsqueda, o falla, la directiva se reprocesa como si tuviera la sintaxis (1) con idéntica secuencia contenida (incluyendo caracteres >, si hay) en la directiva original.
3) Los tokenes de preprocesamiento después de include en la directiva se procesan como un texto normal (por ejemplo, cada identificador definido como un nombre de macro se sustituye por sus lista de reemplazo de tokenes de preprocesamiento). Si la directiva resultante después de todas las sustituciones no coincide con uno de los dos formatos anteriores, el comportamiento está indefinido. El método por el que una secuencia de tokenes de preprocesamiento entre el par de tokenes < y > o un par de caracteres " se combina en un solo token de preprocesamiento de nombre de cabecera está definido por la implementación.
4) La cabecera o archivo fuente identificado por secuencia-caracteres-h o secuencia-caracteres-q se busca como si esa secuencia de token de preprocesamiento fueran los tokenes-pp en la sintaxis (3), excepto que no se realiza ninguna expansión de macro adicional. Si dicha directiva no cumple los requisitos sintácticos de una directiva #include, el programa está mal formado. La expresión __has_include se evalúa como 1 si la búsqueda tiene éxito y como 0 si la búsqueda falla.
5) Esta forma solamente se considera si no coincide la sintaxis (4), en cuyo caso los tokenes de preprocesamiento se procesan como un texto normal.

Si la cabecera identificada por el nombre-cabecera (por ejemplo, <secuencia-caracteres-h> o "secuencia-caracteres-q") denota una cabecera que se puede importar, está definido por la implementación si la directiva #include se sustituye por una directiva de importación de la forma

importnombre-cabecera;nueva-línea

(desde C++20)

__has_include se puede expandir en las expresiones de #if y #elif. Se trata como una macro definida por #ifdef, #ifndef, #elifdef, #elifndef(desde C++23) y defined pero no se puede usar en ningún otro lugar.

[editar]Notas

Las implementaciones típicas buscan solamente en los directorios de inclusión estándar para la sintaxis (1). La bibliotecas estándar de C++ y C están implícitamente incluidas en esos directorios de inclusión estándar. Normalmente los directorios de inclusión estándar se controlan por el usuario mediante opciones del compilador.

El objetivo de la sintaxis (2) es buscar archivos que no son controlador por la implementación. Normalmente las implementaciones buscan primero en el directorio del archivo actual y luego prueban con (1).

Cuando se incluye un archivo, se procesa por las fases de traducción 1-4, que pueden incluir, recursivamente, la expansión de directivas #include anidadas, hasta el límite de anidamiento definido por la implementación. Para evitar la inclusión repetida del mismo archivo y la recursión infinita cuando un archivo se incluye a sí mismo, tal vez transitivamente, se usa comúnmente guardias de cabecera: toda la cabecera está inserta en

#ifndef FOO_H_INCLUDED /* cualquier nombre asignado de forma única al nombre del archivo */#define FOO_H_INCLUDED// aquí está el contenido del archivo#endif

Muchos compiladores también implementan la directiva no estándar pragma#pragma once con efectos similares: deshabilita el procesamiento de un archivo si el mismo archivo (donde la identificación del archivo se determina por el Sistema Operativo) ya fue incluido.

Que __has_include se evalúe como 1 solo significa que existe una cabecera o archivo fuente con el nombre especificado. No significa que la cabecera o archivo fuente, cuando se incluyan, no causen un error o contengan algo útil. Pore ejemplo, en una implementación de C++ que admite los modos C++14 y C++17 (y proporciona __has_include en su modo C++14 como una extensión conforme), __has_include(<opcional>) puede ser 1 en C++14, pero en realidad #include <opcional> puede causar un error.

[editar]Ejemplo

#if __has_include(<optional>)# include <optional># define tiene_optional 1template<class T>using optional_t =std::optional<T>;#elif __has_include(<experimental/optional>)# include <experimental/optional># define tiene_optional -1template<class T>using optional_t =std::experimental::optional<T>;#else# define tiene_optional 0# include <utility>template<class V>class optional_t { V v_{};bool tiene_{false};public: optional_t()=default; optional_t(V&& v): v_(v), tiene_{true}{} V valor_o(V&& alt)const&{return tiene_ ? v_ : alt;}/*...*/};#endif   #include <iostream>   int main(){if(tiene_optional >0)std::cout<<"<optional> está presente\n";elseif(tiene_optional <0)std::cout<<"<experimental/optional> está presente\n";elsestd::cout<<"<optional> no está presente\n";   optional_t<int> op;std::cout<<"op = "<< op.valor_o(-1)<<'\n'; op =42;std::cout<<"op = "<< op.valor_o(-1)<<'\n';}

Salida:

<optional> está presente op = -1 op = 42

[editar]Vésase también

Una lista de archivos de cabecera de la biblioteca estándar C++
Documentación de C para Inclusión de archivos fuente
close