2012-05-21 7 views
6

He hecho algunas búsquedas y he encontrado subprocesos similares en la forma correcta de incluir archivos de encabezado en C++, pero ninguno de ellos ha respondido esta pregunta.#include archivos de encabezado cuando están en una estructura de directorio diferente

sé que con el fin de incluir un archivo de cabecera en otra carpeta puede simplemente usar la siguiente sintaxis:

#include "../myFolder/myFile.h" 

Pero ¿qué pasa cuando el archivo se encuentra en una estructura de directorios diferente un poco alejada? Por ejemplo, si algo como lo siguiente está garantizada para ser verdad:

actual directorio =/F1/F2/F3/F4/F5/MyFile.cpp

directorio encabezado deseado =/F1/D2/D3/d4/d5/d6/myHeader.h

Sé que puede establecer la propiedad "Incluir directorios adicionales" o utilizar un archivo make, pero me gustaría saber si hay una forma de hacerlo desde el #include declaración.

+1

Obviamente, puede poner toda esa ruta relativa o absoluta en su declaración de inclusión (que no recomendaría), pero sospecho que está buscando algo un poco más compacto? – JohnMcG

+0

¡Gracias por el comentario! Estoy buscando para ver si hay una manera de hacerlo y todavía tenerlo es relativo, por lo que no importa lo que está por encima de f1 (en este ejemplo) en la estructura del directorio. – user1205577

+0

Bueno, puedes unir "...", por ejemplo, '#include ../../../../../../ f2/f3/f4/f5/myFile.cpp' que es tan feo que inmediatamente me arrepiento de haberlo tipeado. Recomiendo establecer la ruta de inclusión en el archivo MAKE. – JohnMcG

Respuesta

10

poniendo ".." en #include generalmente se considera feo y no se puede mantener.

Cada biblioteca coherente que está utilizando (por ejemplo, aumentar) tiene una única raíz de jerarquía de archivos de encabezado que debe poner en su propiedad "directorios de inclusión adicionales". Por impulso que es algo así como

`C:/lib/boost_1_49` 

en este directorio se suele encontrar un directorio llamado boost donde viven todas las cabeceras. Esto trae la convención de que todos los encabezados de impulso comienzan con:

#include <boost/bla/bla.hpp> 

Esto también se aplica al proyecto que está escribiendo. Debes decidir cuál es la mejor raíz para sus encabezados y comenzar todos los includes desde allí.
La única excepción a esta regla deben ser los encabezados que están en el mismo directorio. Esos solo se pueden incluir como solo un nombre de archivo #include "same-dir-header.h"

También debe hacer la diferencia entre incluir con "" y <>. Las comillas deben ser elementos de su proyecto, los paréntesis angulares deben ser bibliotecas externas (o como algunos lo tienen: bibliotecas de tiempo de ejecución de C y OS)

+0

El truco aquí es que se garantiza que la estructura del directorio será la misma en términos relativos, pero no en la máquina en la que todo vivirá. Suena cada vez más como si se necesitara un archivo make, pero solo quería saber si era posible. – user1205577

+1

También es * genuinamente * no portátil. Una vez, intentamos escribir código para trabajar con dos compiladores: un pariente evaluado incluye en los archivos '.h' relativo a la ubicación del archivo' .h', y el otro incluye el mismo en relación con el archivo '.c' . Incluir rutas es el camino a seguir. El problema básico es que el significado de '..' y'/'en las directivas include está definido por la implementación. –

0

Para completar la respuesta de @shoosh, se supone que debe indicarle a su compilador dónde están "otros" archivos de encabezado. Con gcc en las ventanas, si se encuentran en c: \ ruta \ a \ biblioteca, a continuación, añadir la opción -I

-ic: \ ruta \ a \ biblioteca

Cuidado con los espacios en ruta , que su c: \ mi ruta \ a \ biblioteca, entonces:

-I "c: \ my_path \ a \ library"

Otros compiladores proporcionará una opción similar, en la línea de comandos o a través del IDE.

Cuestiones relacionadas