2009-12-23 14 views
8

Dado este árbol de directorios:Al incluir archivos de encabezado, ¿es sensible la ruta de acceso?

src/MyLibrary/MyHeader.h 
src/file.cpp 

file.cpp: 

#include "mylibrary/myheader.h" 
... 

file.cpp Compilación trabaja con VS, fracasa en gcc.

  • ¿Qué dice la norma?
  • Si la ruta distingue entre mayúsculas y minúsculas, ¿por qué es así?
  • ¿Cuál es la mejor práctica, mantener todos los nombres de archivos/carpetas en minúsculas y hacer lo mismo al incluirlos?

Gracias.

Respuesta

21

La sensibilidad de la carcasa depende del sistema operativo. Windows no distingue entre mayúsculas y minúsculas Linux es.

EDIT:

En realidad, como se observa por Martin York 's comentario, la sensibilidad caso depende del sistema de archivos. Por defecto, Windows usa un sistema de archivos insensible a las mayúsculas y minúsculas, mientras que Linux usa uno que distingue entre mayúsculas y minúsculas. Para quien esté interesado en saber qué sistemas de archivos son sensibles a mayúsculas y minúsculas y cuáles no, hay una lista completa en Wikipedia: Comparison of file name limitations.

+0

En realidad, está más relacionado con el sistema de archivos utilizado más bien que con el sistema operativo. El valor predeterminado es como se define arriba. Pero en Linux hay una gran variedad de sistemas de archivos para elegir, algunos de los cuales no distinguen entre mayúsculas y minúsculas. –

+0

@Martin: Sí, tienes razón. Gracias por la observación precisa. –

+1

¿La sensibilidad de mayúsculas/minúsculas no está especificada por C89/99/++ 11? o dice el estándar que las rutas de búsqueda y los nombres de archivo no distinguen entre mayúsculas y minúsculas? –

0

No es el estándar C++, es el modo Linux, donde todos los nombres de ruta distinguen entre mayúsculas y minúsculas. La mejor práctica es elegir el nombre de archivo que desee (principalmente en minúscula) y usar el mismo caso en la directiva de inclusión. También siempre use rutas de archivos relativas.

+0

Me temo que estás equivocado. Es ** el ** Estándar de C++ que controla esto, y permite que cualquier implementación realice la búsqueda como lo considere conveniente. – IInspectable

1

Otro punto para recordar es el separador de ruta de caracteres. Aunque Visual Studio (y otros IDEs de Windows estoy seguro) aceptará '/' o '\', siempre debe usar '/' dentro de una ruta de inclusión para la portabilidad.

+2

Para una mejor portabilidad, como mover archivos de fuentes, las rutas no deberían estar en el código fuente sino en el compilador. Si los archivos de cabecera se mueven, entonces todo el código que los referencia por ruta debe ser cambiado y probado la regresión. –

+0

@ThomasMatthews Nunca había pensado en eso. ¿Cómo incluirías tus encabezados sin usar sus respectivas subcarpetas? – NicoBerrogorry

1

¿Qué dice la norma?

entre mayúsculas y minúsculas en #include directivas es controlado por la aplicación (compilador/preprocesador). Esto se explica en virtud de 16.2.2 [cpp.include]:

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.

mismo modo, 16.2.3 [cpp.include]:

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 identificados por la secuencia especificada entre los 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.

Una opción natural para una implementación del lenguaje es utilizar la sensibilidad de mayúsculas y minúsculas del sistema de archivos o sistema operativo, pero no hay un requisito estricto para hacerlo (como sugieren todas las otras respuestas).

¿Cuál es la mejor práctica, mantener todos los nombres de archivos/carpetas en minúsculas y hacer lo mismo al incluirlos?

Mejor práctica, como siempre: Mantenga las cosas consistentes. Si está utilizando archivos fuente/encabezado de mayúsculas y minúsculas en su proyecto, siga utilizándolos y replique la carcasa exacta en sus directivas #include.

Cuestiones relacionadas