При включении заголовочных файлов путь чувствителен к регистру? - PullRequest
10 голосов
/ 23 декабря 2009

Учитывая это дерево каталогов:

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

file.cpp:

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

Компиляция file.cpp работает с VS, не работает в gcc.

  • Что говорит стандарт?
  • Если путь чувствителен к регистру, почему это разумно?
  • Каков наилучший способ: сохранять все имена файлов / папок строчными и, следовательно, делать то же самое при включении?

Спасибо.

Ответы [ 4 ]

23 голосов
/ 23 декабря 2009

Чувствительность к регистру зависит от операционной системы. Windows не чувствительна к регистру. Linux есть.

EDIT:

На самом деле, как заметил комментарий Martin York , чувствительность к регистру зависит от файловой системы. По умолчанию Windows использует регистронезависимую файловую систему, в то время как Linux использует регистрозависимую. Для тех, кому интересно знать, какие файловые системы чувствительны к регистру, а какие нет, в Википедии есть полный список: Сравнение ограничений имен файлов .

3 голосов
/ 14 мая 2016

Что говорит стандарт?

Чувствительность к регистру в директивах #include контролируется реализацией (компилятор / препроцессор). Это объясняется в 16.2.2 [cpp.include]:

Директива предварительной обработки вида
# include < h-char-sequence> new-line
ищет последовательность мест, определенных реализацией, для заголовка, уникально идентифицированного указанной последовательностью между разделителями < и >, и вызывает замену этой директивы всем содержимым заголовка. Способ определения мест или определения заголовка определяется реализацией.

Аналогично, 16.2.3 [cpp.include]:

Директива предварительной обработки вида
# include " q-char-sequence" new-line
вызывает замену этой директивы всем содержимым исходного файла, идентифицируемого указанной последовательностью между разделителями ". Именованный исходный файл ищется в соответствии с реализацией. Если этот поиск не поддерживается или поиск не удался, директива обрабатывается повторно, как если бы она читала
# include < h-char-sequence> new-line
с идентичной содержащейся последовательностью (включая > символов, если таковые имеются) из исходной директивы.

Естественным выбором для реализации языка является использование чувствительности к регистру файловой системы или ОС, но строгого требования для этого нет (как предполагают все другие ответы).

Как лучше всего сохранять все имена файлов / папок строчными и, следовательно, делать то же самое при включении?

Лучшая практика, как всегда: придерживайтесь последовательности. Если вы используете в своем проекте исходные / заголовочные файлы в смешанном регистре, продолжайте использовать их и копируйте точный регистр в директивах #include.

1 голос
/ 23 декабря 2009

Еще один момент, о котором следует помнить, это символ-разделитель пути . Несмотря на то, что Visual Studio (и я уверен, что в других IDE Windows) будет принимать «/» или «\», вы всегда должны использовать «/» в пути включения для переносимости.

0 голосов
/ 23 декабря 2009

Это не стандарт C ++, это способ Linux, где все имена путей чувствительны к регистру. Рекомендуется также выбрать любое имя файла (в основном строчные) и использовать тот же регистр в директиве include. Также всегда используйте относительные пути к файлам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...