Что они подразумевают под «тогда в каталогах цитат»? - PullRequest
3 голосов
/ 03 апреля 2020

На странице 8 из Версия препроцессора C версии 10.0.1 имеет следующее утверждение:

#include "file"

Этот вариант используется для заголовочных файлов вашей собственной программы. Он ищет файл с именем file сначала в каталоге, содержащем текущий файл, , затем в каталогах цитат , а затем в тех же каталогах, которые использовались для <file>. Вы можете добавить каталоги к списку каталогов котировок с помощью опции ‘-iquote’.

Что означает «затем в каталогах цитат»?

Ответы [ 4 ]

3 голосов
/ 03 апреля 2020

Документация гласит:

Вы можете добавить каталоги к списку каталогов котировок с помощью опции '-iquote'.

Таким образом, "каталоги цитат" те каталоги, которые были переданы в качестве аргументов с использованием опции -iquote 1 . Документация для опции гласит:

-iquote dir

Поиск в каталоге только для заголовочных файлов, запрошенных с помощью "#include" file ""; они не ищут "#include " перед всеми каталогами, указанными -I, и перед стандартными системными каталогами. Если dir начинается с "=", то "=" будет заменен префиксом sys root; см. --sys root и -isys root.

1 И теоретически, из какого-то другого источника. Я не знаю ни одного другого документированного источника для каталогов dirs; нет списка по умолчанию, как представляется, задокументированы. Я предполагаю, что список пуст по умолчанию.

2 голосов
/ 03 апреля 2020

g cc принимает несколько видов параметров командной строки, описывающих включаемые каталоги:

-I - поиск выполняется в случае формы #include <file> и в случае формы #include "file", если другие методы не работают

-iquote - поиск производится только в случае формы #include "file", если файл не найден в каталоге вместе с включенным файлом. Он определяет эти «каталоги цитат».

0 голосов
/ 03 апреля 2020

По моему опыту, "каталоги котировок" не является стандартным термином. Скорее, это выглядит как ad ho c описание тех каталогов, в которых ищется форма цитаты #include, но не форма угловых скобок. Он может быть получен из параметров командной строки, используемых для указания каталогов, в которых можно найти заголовки (описано на стр. 63-64 в связанном документе).

  • -I dir Подумайте «Включить каталог»; dir добавлено в список каталогов, в которых ищутся все директивы #include.
  • -isystem dir Подумайте "system include directory"; dir добавляется (в начало) списка каталогов с системными заголовками. (Эти заголовки традиционно используют форму угловых скобок #include, но это не является обязательным требованием.) Поскольку каталоги для системных заголовков ищутся в обеих формах #include, эта опция в значительной степени избыточна с -I (или, возможно, -I следует рассматривать как в значительной степени избыточные с этим).
  • -iquote dir Подумайте "quote include directory"; dir добавляется в (изначально пустой) список каталогов для поиска заголовков, указанных в форме кавычек #include. (Эти заголовки традиционно - это те, которые вы пишете, но это не обязательно.) Эти каталоги не ищутся для версии в угловых скобках.

Таким образом, "каталоги кавычек" являются каталоги, где заголовки могут жить для формы кавычек #include, но не для формы угловых скобок. Часто этот уровень точности не требуется, и достаточно параметра -I. (Следовательно, нет необходимости в стандартном термине «каталоги котировок».)

0 голосов
/ 03 апреля 2020

Стандарт C гласит:

6.10.2 Включение исходного файла
Ограничения
A #include директива должен идентифицировать заголовок или исходный файл, который может быть обработан реализацией.
Семантика
Директива предварительной обработки вида

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

ищет последовательность, определенную реализацией помещает заголовок, который уникальным образом определяется указанной последовательностью между разделителями < и >, и вызывает замену этой директивы всем содержимым заголовка. Способ определения мест или определения заголовка определяется реализацией.
Директива предварительной обработки вида

# include "<i>q-char-sequence</i>" <i>new-line</i>

вызывает замену этой директивы на все содержимое исходного файла, идентифицируемого указанным последовательность между " разделителями. Именованный исходный файл ищется в соответствии с реализацией. Если этот поиск не поддерживается или поиск не выполняется, директива обрабатывается повторно, как если бы она читала

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

с идентичной содержащейся последовательностью (включая > символов, если таковые имеются) из исходной директивы.

В заключение, каталоги кавычек - это каталоги, которые ищутся в соответствии с реализацией, прежде чем искать каталоги в стандартном пути включения.

...