Inclusión de archivos fuentes
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) | ||||||||
#include tokenes-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) | |||||||
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
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.#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.Si la cabecera identificada por el nombre-cabecera (por ejemplo,
| (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 |