Сначала простой вопрос:
Имеет ли значение, если они также написаны заглавными буквами определенным образом?
В большинстве случаев includes
относится к файлами компилятор должен быть в состоянии найти файл, который вы включаете в систему.По этой причине капитализация имеет значение во всех системах, где файловая система чувствительна к регистру.Если вы хотите сохранить минимум переносимости, вы должны быть последовательны в именах файлов и include
.(Все linux и mac os по умолчанию имеют чувствительные к регистру файловые системы, в Windows вы также можете настроить NTFS так, чтобы они были чувствительными к регистру).
Теперь, действительно ли имеет значение, как называется файл?Нет, пока вы последовательны во включениях.Также обратите внимание, что для облегчения включения рекомендуется следовать шаблону.
Имеет ли значение, как я импортирую файлы заголовков?
Стандарт не совсем понятен для этоготочка, и разные реализации шли разными путями.Стандарт определяет, что они могут быть разными, так как набор местоположений и порядок, в котором компилятор будет искать включенный файл, определяется реализацией и может отличаться, если включение выполняется с помощью угловых скобок или двойных кавычек.Если при включении в кавычки не удается найти файл, компилятор должен выполнить обработку для включения, как если бы оно было записано в угловых скобках.
#include <x.h> // search in order in set1 of directories
#include "x.h" // search in order in set2 of directories
// if search fails, search also in set1
Это означает, что если файл присутствует только в set1,оба типа включений найдут его.Если файл присутствует в set2, но не в set1, его найдет только цитата include.Если в set1 и set2 присутствуют разные файлы с одинаковыми именами, то каждый тип включения будет находить и включать разные файлы.Если в общем подмножестве set1 и set2 присутствуют два файла с одинаковыми именами, но порядок наборов различен, каждый тип включения может найти свой файл.
Возвращаясь к реальному миру, большинство компилятороввключать только текущий каталог в set2, причем set1 - это все места включения системы (которые обычно могут быть расширены с помощью аргументов компилятора). В этих случаях, если файл присутствует только в текущем каталоге, #include "a.h"
найдет его, но #include <a.h>
не будет.
Теперь, является ли это обычным поведением, существует некоторая подразумеваемая семантика, которая является идиоматической в C / C ++.Обычно квадратные скобки используются для включения системных заголовков и внешних заголовков, в то время как двойные кавычки используются для включения локальных файлов.Существует серая зона относительно того, следует ли считать библиотеку в том же проекте локальной или внешней .То есть, даже если всегда будет работать включение с двойными кавычками, большинство людей будут использовать угловые кавычки для ссылки на заголовки, которые не являются частью текущего модуля .
Наконец, пока нет компилятора, которыйЯ знаю, делает ли это, стандарт позволяет реализации (компилятору) не создавать стандартные заголовки в виде реальных файлов, а обрабатывать включение стандартных заголовков внутри.Это единственный случай, когда теоретически #include "vector"
может не включать определения класса std::vector
(или любого другого стандартного заголовка).Но это не практический вопрос, и я не думаю, что он когда-либо будет.