#c #compiler-construction #header-files #include-path
#c #компилятор-конструкция #заголовочные файлы #включить-путь
Вопрос:
Когда вы пишете #include "foo.h"
, я бы ожидал, что компилятор сначала проверит каталог файла, выполняющего включение (в отличие от текущего каталога), и, если он там не найден, затем вернется к поиску по списку путей, как в случае #include <foo.h>
.
Если не указан абсолютный путь #include "/foo.h"
, в этом случае необходимо проверять только абсолютный путь.
Существуют ли какие-либо компиляторы C, в которых правила отличаются?
Комментарии:
1. я использую gcc, но правила те же, что вы перечислили ..! я думаю, что включение таких файлов является частью материала на языке C, не так ли?
2. Как ни странно, нет, в спецификации языка указано, что это определено реализацией. Вот почему я хочу проверить, поступают ли какие-либо реализации иначе.
3. о, тогда 1 вам … может быть, какая-то цепочка инструментов для кросс-компиляции выполняется каким-то другим способом ..! o / w gcc, sun studio, visual studio, компилятор turbo, все следуют этим правилам.
4. Стандарт не может определить, как искать каталоги, поскольку это ограничило бы реализацию системами, которые фактически имеют каталоги в своей файловой системе. Или иметь файловую систему…
Ответ №1:
Керниган и Ричи пишут:
[#include «foo»] сначала выполняет поиск в соответствии с исходным исходным файлом (намеренно зависящая от реализации фраза), и если этот поиск завершается неудачей, то как в первой форме.
Это означает, что не делайте никаких предположений о стратегии поиска кавычек. Однако все компиляторы, с которыми я сталкивался, используют общую практику поиска сначала по пути включающего файла, а затем возвращаются к пути поиска компилятора, если не найдены.