2010-10-02 3 views

ответ

1

I случай «» компилятором первый поиск заголовочный файл в локальном каталоге, где файл .c представляет

в то время как в случае <> компилятор искать только в заголовке папку

6

Вторая версия указан для поиска сначала в определенном месте реализации, а затем, если файл не найден, выполните поиск в том же месте, что и версия <...>, которая выполняет поиск по путям, обычно указанным в командной строке -I, и встроенными путями включения (указывая на расположение стандартных библиотек и системных заголовков).

Обычно реализации определяют, что местоположение должно быть относительно местоположения файла включения.

8

<stdio.h> выполняет поиск в стандартных ячейках библиотеки C, тогда как "stdio.h" выполняет поиск в текущем каталоге.

В идеале вы бы использовали <...> для стандартных библиотек C и "..." для библиотек, которые вы пишете и присутствуют в текущем каталоге.

+0

Вы имеете в виду, если мой * .c файл не находится в каталоге, в котором присутствует стандартная библиотека C, тогда будет ошибка? – Parikshita

+0

нет, потому что он все равно выглядит. И я сомневаюсь, что ваш файл c находится в стандартной папке C в любом случае. –

+0

Нет. Если вы используете '' ... "', единственное различие заключается в том, что ваш файл '.h' будет искать в текущем каталоге, а также в стандартных ячейках библиотеки C. –

1

#include <something.h> предназначен для системных заголовков, а #include "something.h" предназначен для заголовков вашей собственной программы. Системные заголовки ищутся в обычных системных каталогах (и те, которые включены в аргумент -I), которые ищутся в ваших заголовках в текущем каталоге, а затем в тех же местах, что и системные заголовки.

см http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC6

1

Для составителей, которые я использовал, «...» начинает поиск включаемого файла в том же каталоге, что и исходный файл, который компилируется, то включать путь. Включает в себя: < ...> начало в путь включения, пропуская текущую матрицу, если она не включена в путь включения.

1

Обычно стандартные заголовочные файлы заключены <> и конкретные файлы других пользовательских предписанный в технических заданиях с ".

2

<> сообщить компилятору искать файл в заголовках библиотек и„“сказать ему, чтобы посмотреть вокруг среди заголовков вашего приложения.

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

0

<stdio.h> относится к заголовок (не заголовочный файл)
"stdio.h" относится к исходному файлу.

Заголовки не обязательно должны быть физически реализованы; (как правило, заголовки представляют собой файлы в определенных каталогах)

Когда директива использует ", исходный файл выполняется в соответствии с реализацией и, если не найден, эта директива перерабатывается как если бы он был написан с < и > в первую очередь.

+0

Я смущен формулировками C99. Означает ли это, что '#include ' недействителен, поскольку 'unistd.h' не является заголовком? Или есть еще одна причина, по которой он использует «header» для '<...>', но «исходный файл» для '' ... "'? –

+0

Читая его снова, он, кажется, не говорит, что стандартные заголовки представляют собой набор заголовков исключительно. Таким образом, могут быть реализованы определенные заголовки, такие как заголовки столбцов и т. Д. –

+0

@litb: Я думаю, что 'unistd.h' является заголовком, если реализация (или в этом случае стандарт POSIX, реализация которой также реализуется) говорит, что это заголовок. Это не стандартный заголовок, но я не думаю, что стандарт C99 запрещает реализациям разрешать заголовки, отличные от стандартных. Я не могу найти нигде, где это явно разрешено, просто текст о сопоставлении идентификаторов с заголовками, определяемых реализацией. –

0

Разница заключается в том, что заголовочные файлы, созданные разработчиком, заключены в "". Файлы заголовков, которые уже находятся в системе, заключены в <>. Даже заголовкам <> нужна директива -I, если расположенные каталоги не находятся в пути поиска компилятора.

Итог: Ваши заголовки с «», система заголовков с <>

2

Вы используете #include, когда вы хотите сказать: «искать файл с таким именем в системе включают в себя каталог». Вы используете #include «doublequoted», когда хотите сказать: «Ищите файл с этим именем в каталоге include моего собственного приложения, однако, если он не может быть найден, загляните в каталог include системы».

Смежные вопросы