¿Cuál es la diferencia entre #incluir y #incluir “nombre de archivo”?

11 minutos de lectura

¿Cuál es la diferencia entre #incluir y #incluir "nombre de archivo"?
búsqueda49

En los lenguajes de programación C y C++, ¿cuál es la diferencia entre usar paréntesis angulares y usar comillas en un include declaración, de la siguiente manera?

  1. #include <filename>
  2. #include "filename"

¿Cuál es la diferencia entre #incluir y #incluir "nombre de archivo"?
piCookie

La única forma de saberlo es leer la documentación de su implementación.

En el estándar cla sección 6.10.2, párrafos 2 a 4 establece:

  • Una directiva de preprocesamiento de la forma

    #include <h-char-sequence> new-line
    

    busca una secuencia de lugares definidos por la implementación para un encabezamiento identificado únicamente por la secuencia especificada entre el < y > delimitadores, y provoca la sustitución de esa directiva por todo el contenido de la encabezamiento. Cómo se especifican los lugares o se identifica el encabezado está definido por la implementación.

  • Una directiva de preprocesamiento de la forma

    #include "q-char-sequence" new-line
    

    provoca la sustitución de dicha directiva por todo el contenido de la archivo fuente identificado por la secuencia especificada entre el " delimitadores el nombrado archivo fuente se busca de una manera definida por la implementación. Si esta búsqueda no es compatible, o si la búsqueda falla, la directiva se reprocesa como si leyera

    #include <h-char-sequence> new-line
    

    con la misma secuencia contenida (incluyendo > caracteres, si los hay) de la directiva original.

  • Una directiva de preprocesamiento de la forma

    #include pp-tokens new-line
    

    (que no coincide con una de las dos formas anteriores) está permitido. Los tokens de preprocesamiento después include en la directiva se procesan igual que en el texto normal. (Cada identificador actualmente definido como un nombre de macro se reemplaza por su lista de reemplazo de tokens de preprocesamiento). La directiva resultante después de todos los reemplazos deberá coincidir con una de las dos formas anteriores. El método por el cual una secuencia de tokens de preprocesamiento entre un < y un > par de tokens de preprocesamiento o un par de " los caracteres se combinan en un solo nombre de encabezado El token de preprocesamiento está definido por la implementación.

Definiciones:

  • h-char: cualquier miembro del conjunto de caracteres de origen excepto el carácter de nueva línea y >

  • q-char: cualquier miembro del conjunto de caracteres de origen excepto el carácter de nueva línea y "

  • Relevante: implementación en g ++ y en visualc++

    – Alexander Malajov

    10 de octubre de 2012 a las 3:48

  • @piCookie tanto como “nombre de archivo” buscan lugares definidos por la implementación. Entonces cuál es la diferencia ?

    – onmyway133

    4 de febrero de 2013 a las 3:45

  • @Stefan, solo estoy citando el estándar que no dice nada sobre INCLUDE_PATH. Su implementación puede hacer eso, y la mía no. La pregunta original era genéricamente C y no específicamente gcc (que no creo que use INCLUDE_PATH) o Microsoft C (que creo que sí) o cualquier otra, por lo que no se puede responder de manera genérica, sino que se debe hacer referencia a la documentación de cada implementación.

    – piCookie

    25 de agosto de 2013 a las 0:22

  • Al igual que con todas estas situaciones, los ejemplos concretos (especialmente de escenarios comunes) son muy útiles e igualmente apreciados. Las respuestas genéricas innecesariamente obtusas no tienen tanto uso práctico.

    – vargoniano

    29/04/2014 a las 17:51

  • “Así es como el estándar C puede ser detallado y no responder a su pregunta”

    – anatolyg

    29/03/2015 a las 19:32

  • +1, esta es probablemente la respuesta más concisa y correcta aquí. De acuerdo con el estándar (que piCookie cita en su respuesta), el único verdadero la diferencia es “encabezado” versus “archivo fuente”. El mecanismo de búsqueda está definido por la implementación de cualquier manera. El uso de comillas dobles significa que tiene la intención de incluir un “archivo fuente”, mientras que los corchetes angulares significan que tiene la intención de incluir un “encabezado” que, como dice, puede no ser un archivo en absoluto.

    – Moldeado Dan

    17 de agosto de 2009 a las 16:12

  • Vea el comentario de Dan Moulding a la respuesta de quest49; los encabezados estándar no tienen que estar en forma de archivo, pueden estar integrados.

    – aib

    27 de enero de 2011 a las 9:28

  • He estado leyendo esto “los encabezados estándar no tienen que estar en forma de archivo” durante una década. ¿Te importaría dar un ejemplo del mundo real?

    – Máximo Egorushkin

    8 de febrero de 2011 a las 11:54

  • @Maxim Yegorushkin: Tampoco puedo pensar en ningún ejemplo existente del mundo real; sin embargo, no puede existir un compilador C11 completo para MS-DOS a menos que los encabezados no tengan que ser archivos. Esto se debe a que algunos de los nombres de encabezado C11 no son compatibles con la limitación de nombre de archivo “8.3” de MS-DOS.

    – Moldeado Dan

    12/10/2012 a las 12:35

  • @MaximEgorushkin: El compilador VAX/VMS C mantuvo todos los encabezados de la biblioteca de tiempo de ejecución de C en un solo archivo de biblioteca textual (similar a un archivo de Unix) y usó la cadena entre el < y > como la clave para indexar en la biblioteca.

    – Adrián McCarthy

    15 de febrero de 2017 a las 23:14

¿Cuál es la diferencia entre #incluir y #incluir "nombre de archivo"?
Yann Droneaud

Algunas buenas respuestas aquí hacen referencia al estándar C pero olvidaron el estándar POSIX, especialmente el comportamiento específico del c99 (por ejemplo, compilador C) mando.

De acuerdo a The Open Group Base Especificaciones Edición 7,

-I directorio

Cambie el algoritmo para buscar encabezados cuyos nombres no sean rutas de acceso absolutas para buscar en el directorio nombrado por el directorio nombre de ruta antes de buscar en los lugares habituales. Así, las cabeceras cuyos nombres están entre comillas dobles ( “” ) se buscarán primero en el directorio del archivo con el #incluir línea, luego en directorios nombrados en -I opciones, y por último en los lugares habituales. Para los encabezados cuyos nombres están entre corchetes angulares ( ““), el encabezado se buscará solo en los directorios nombrados en -I opciones y luego en los lugares habituales. Directorios nombrados en -I las opciones se buscarán en el orden especificado. Las implementaciones admitirán al menos diez instancias de esta opción en un solo c99 invocación de comandos.

Entonces, en un entorno compatible con POSIX, con un compilador C compatible con POSIX, #include "file.h" es probable que vaya a buscar ./file.h primero, donde . es el directorio donde se encuentra el archivo con el #include declaración, mientras #include <file.h>es probable que vaya a buscar /usr/include/file.h primero, donde /usr/include ¿está definido su sistema? lugares habituales para encabezados (parece que POSIX no lo define).

  • ¿Cuál es la fuente exacta del texto? ¿Es de la parte normativa de IEEE Std 1003.1, 2013?

    – osgx

    12 de marzo de 2015 a las 2:34

  • @osgx: esa redacción (o algo extremadamente similar) se encuentra en la especificación POSIX para c99 — que es el nombre POSIX para el compilador de C. (El estándar POSIX 2008 difícilmente podría referirse a C11; la actualización de 2013 a POSIX 2008 no cambió el estándar C al que se refería).

    –Jonathan Leffler

    10 de noviembre de 2016 a las 3:40

  • Este fue mi primer pensamiento también. La página de manual de gcc incluye esto al igual que otros. También hay algo similar para las bibliotecas: -L.

    – Priftan

    21 de noviembre de 2019 a las 22:55


El comportamiento exacto del preprocesador varía entre compiladores. La siguiente respuesta se aplica a GCC y varios otros compiladores.

#include <file.h> le dice al compilador que busque el encabezado en su directorio “incluye”, por ejemplo, para MinGW, el compilador buscaría file.h en C:\MinGW\include\ o donde sea que esté instalado su compilador.

#include "file" le dice al compilador que busque en el directorio actual (es decir, el directorio en el que reside el archivo fuente) para file.

Puedes usar el -I marca para que GCC le diga que, cuando encuentra un incluir con corchetes angulares, también debe buscar encabezados en el directorio después -I. GCC tratará el directorio después de la bandera como si fuera el includes directorio.

Por ejemplo, si tiene un archivo llamado myheader.h en su propio directorio, podría decir #include <myheader.h> si llamaste a GCC con la bandera -I . (lo que indica que debe buscar inclusiones en el directorio actual).

Sin el -I bandera, tendrás que usar #include "myheader.h" para incluir el archivo, o mover myheader.h al include directorio de su compilador.

  • ¿Cuál es la fuente exacta del texto? ¿Es de la parte normativa de IEEE Std 1003.1, 2013?

    – osgx

    12 de marzo de 2015 a las 2:34

  • @osgx: esa redacción (o algo extremadamente similar) se encuentra en la especificación POSIX para c99 — que es el nombre POSIX para el compilador de C. (El estándar POSIX 2008 difícilmente podría referirse a C11; la actualización de 2013 a POSIX 2008 no cambió el estándar C al que se refería).

    –Jonathan Leffler

    10 de noviembre de 2016 a las 3:40

  • Este fue mi primer pensamiento también. La página de manual de gcc incluye esto al igual que otros. También hay algo similar para las bibliotecas: -L.

    – Priftan

    21 de noviembre de 2019 a las 22:55


¿Cuál es la diferencia entre #incluir y #incluir "nombre de archivo"?
Pedro Mortensen

La documentación de GCC dice lo siguiente sobre la diferencia entre los dos:

Los archivos de encabezado del sistema y del usuario se incluyen mediante la directiva de preprocesamiento ‘#include’. Tiene dos variantes:

#include <file>

Esta variante se utiliza para los archivos de encabezado del sistema. Busca un archivo llamado archivo en una lista estándar de directorios del sistema. Puede anteponer directorios a esta lista con el -I opción (ver Invocación).

#include "file"

Esta variante se utiliza para archivos de encabezado de su propio programa. Primero busca un archivo llamado archivo en el directorio que contiene el archivo actual, luego en los directorios de citas y luego en los mismos directorios utilizados para <file>. Puede anteponer directorios a la lista de directorios de cotizaciones con el -iquote opción. el argumento de ‘#include’, ya sea delimitado con comillas o corchetes angulares, se comporta como una constante de cadena en la que no se reconocen los comentarios y los nombres de las macros no se expanden. Por lo tanto, #include <x/*y> especifica la inclusión de un archivo de encabezado del sistema llamado x/*y.

Sin embargo, si se producen barras invertidas dentro del archivo, se consideran caracteres de texto ordinarios, no caracteres de escape. No se procesa ninguna de las secuencias de escape de caracteres apropiadas para las constantes de cadena en C. Por lo tanto,#include "x\n\\y"especifica un nombre de archivo que contiene tres barras invertidas. (Algunos sistemas interpretan ‘\’ como un separador de nombre de ruta. Todos estos también interpretan ‘/’ de la misma manera Es más portátil para usar solo ‘/’.)

Es un error si hay algo (que no sean comentarios) en la línea después del nombre del archivo.

  • ¿Qué es un “directorio de cotizaciones”?

    – Jack M.

    30 de julio de 2020 a las 13:31

  • @JackM • hay 3 ubicaciones: el #include-ing archivo directorio actuallos cotizar directorios (los caminos para verificar el #include "foo.h" el estilo incluye), y el directorios del sistema (los caminos para verificar el #include <bar.h> el estilo incluye).

    – Eljay

    2 de agosto de 2020 a las 13:29

  • ¿Qué significa “sistema” en la frase “archivo de encabezado del sistema”? Encuentro que los científicos informáticos usan mucho la palabra “sistema” y, a menudo, no puedo decir si significa “sistema operativo”, “sistema informático” o algo más.

    – pequeñoO

    15 de noviembre de 2020 a las 0:56


  • Esta es la mejor respuesta. Este tema se puede discutir hasta el infinito durante años y décadas, pero la clara tendencia del compilador es que es para encabezados de sistema y ” ” es para directorio local y encabezados de proyecto. Uso para los encabezados del sistema y ” ” para todo lo demás. De esa forma, queda claro en el código si un encabezado es un encabezado del sistema. Además, de esta manera, si mueve los encabezados de proyectos locales a un directorio diferente a medida que cambia el código, no necesita cambiar ” ” a y viceversa. (PD: Esta es también la metodología ReSharper C++ que incluye encabezados automáticamente para usted).

    usuario2534096

    17/09/2021 a las 15:46


  • Estoy de acuerdo, esta es la mejor respuesta. A modo de aclaración, para mí, un archivo del sistema es cualquier cosa que no haya escrito y al que haga referencia, por supuesto, su compilador lo incluye, pero más allá de eso, cualquier otro paquete instalado. Y un archivo de programa que escribiste. Usando Google protobufs, un archivo de sistema sería , y un archivo de programa sería su protobuf “mydir/my_pb.h”.

    – Bill Gale

    7 oct 2021 a las 21:38

¿Ha sido útil esta solución?