2010-07-01 12 views
168

Duplicar posible:
What is the difference between #include <filename> and #include “filename”?Diferencia entre el soporte angular < > y comillas dobles "" al incluir archivos de encabezado en C++?

¿Cuál es la diferencia entre paréntesis angular < > y comillas dobles " " mientras incluyendo archivos de cabecera en C++?

Me refiero a los archivos que se supone que se incluyen con, por ejemplo: #include <QPushButton> y qué archivos se incluirán utilizando, por ejemplo: #include "MyFile.h" ???

+4

Este es un duplicado exacto de http: // stackoverflow.com/questions/21593/what-is-the-difference-between-include-filename-and-include-filename, aunque la respuesta principal en esa es incorrecta (tiene que ver con las ubicaciones que el preprocesador busca, pero el spec NO DEFINE AQUELLAS LUGARES - el directorio actual es una convención, no un requisito). –

Respuesta

189

Depende del compilador. Dicho esto, en general, usando " prioriza los encabezados en el directorio de trabajo actual sobre los encabezados del sistema. <> generalmente se usa para encabezados de sistema. De la especificación (Sección 6.10.2):

Una directiva de preprocesamiento de la forma

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

búsquedas una secuencia de lugares definido por la implementación para una cabecera identificado de forma única por la secuencia especificada entre el < y > delimitadores, y provoca la sustitución de esa directiva por todo el contenido del encabezado. Cómo se especifican los lugares o el encabezado identificado está definido por la implementación.

Una directiva de preprocesamiento de la forma

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

hace que el reemplazo de la misma Directiva por todo el contenido del archivo de origen identificado por la secuencia especificada entre las " delimitadores. El archivo fuente nombrado 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 vuelve a procesar como si se lee

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

con la secuencia contenida idéntico (incluyendo > caracteres, si lo hay) de la directiva original.

Así que en la mayoría de compiladores, utilizando los "" primero comprueba el directorio local, y si no se encuentra una coincidencia luego pasa a comprobar las rutas del sistema. El uso de <> inicia la búsqueda con los encabezados del sistema.

+1

+1 Información útil. – fingerprint211b

+2

¿Qué quiere decir con "directorio de trabajo actual"? AFAIK las citas dan prioridad al directorio en el que vive el archivo que está usando dicha directiva. –

+0

@ Craig, sí, tienes razón. Escribí algo diferente de lo que quise decir, un efecto secundario del sistema de compilación en el que he estado trabajando últimamente es que los dos son siempre los mismos. –

36

Cuando usa corchetes angulares, el compilador busca el archivo en la lista de rutas de inclusión. Cuando utiliza comillas dobles, primero busca en el directorio actual (es decir, el directorio donde está compilado el módulo) y solo entonces buscará en la lista de rutas de inclusión.

Por lo tanto, por convención, utiliza los corchetes angulares para las inclusiones estándar y las comillas dobles para todo lo demás. Esto garantiza que en el caso (no recomendado) en el que tiene un encabezado local con el mismo nombre que un encabezado estándar, se elegirá el correcto en cada caso.

Cuestiones relacionadas