`#Include" FILE.h "заставляет gcc искать FILE.h в текущем каталоге или где-то еще? - PullRequest
1 голос
/ 13 апреля 2019

Введение в GCC Брайан Гоф говорит

Между прочим, разница между двумя формами включенного состояния #include "FILE.h" и #include <FILE.h> это то, что первое ищет FILE.h в текущем каталоге , прежде чем искать в системных каталогах заголовочных файлов. Оператор включения #include <FILE.h> ищет системные заголовочные файлы, но не ищет в текущем каталоге по умолчанию.

Но следующий пример, по-видимому, подразумевает каталог, содержащий исходный файл, который компилируется, вместо текущего каталога. Что правильно?

$ mv src/hello.h .
$ gcc  -c src/main.c
src/main.c:1:10: fatal error: hello.h: No such file or directory
 #include "hello.h"
          ^~~~~~~~~
compilation terminated.
$ mv hello.h src/
$ gcc  -c src/main.c
$

1 Ответ

2 голосов
/ 13 апреля 2019

https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html утверждает, что

По умолчанию препроцессор ищет заголовочные файлы, включенные в форму кавычек директивы #include "file", сначала относительно каталога текущего файла, а затем в предварительно сконфигурированном списке стандартных системных каталогов. Например, если /usr/include/sys/stat.h содержит #include "types.h", GCC ищет types.h сначала в /usr/include/sys, а затем в обычном пути поиска.

Для формы угловых скобок #include <file> поведение препроцессора по умолчанию заключается в поиске только в стандартных системных каталогах.

Таким образом, документ, который вы читаете, неверен. Возможно, мистер Гоф никогда не пытался написать нерекурсивный Makefile или отделить свои исходные и объектные каталоги, и поэтому никогда не замечал, что «текущий каталог» и «каталог, содержащий текущий файл» не обязательно то же самое.

GCC имеет целый ряд параметров командной строки, которые вы можете использовать для изменения конфигурации #include. Есть даже опция, которая отключает при поиске в каталоге текущего файла (-I-), но ее нельзя использовать во многих операционных системах, потому что она сломает заголовки библиотеки C.

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