включение заголовочных файлов - относительно текущего каталога или для включения каталогов? - PullRequest
7 голосов
/ 08 января 2012

У меня есть следующая директивная структура:

src
  +-- lib1
    +-- lib1.h
  +-- lib2
   +-- lib2.h

И lib1, и lib2 будут распределены (установлены).lib2 использует lib1, поэтому ему нужно несколько:

#include "../lib1/lib1.h" // 1
#include "lib1/lib1.h"    // 2
#include <lib1/lib1.h>    // 3

(1) - прямой путь, но очень негибкий.(2) это способ, которым я сейчас пользуюсь, но система сборки должна знать, что src необходимо добавить в путь включения.(3) мне кажется лучшим в аспекте distribution , потому что тогда можно предположить, что заголовки находятся в стандартном месте, но для меня не слишком очевидно, как система сборки справляется с этим (в данном случае, lib1 должен быть установлен до компиляции lib2.

Какой рекомендуемый способ?

Ответы [ 2 ]

11 голосов
/ 08 января 2012

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

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

3 голосов
/ 08 января 2012

Я голосую за версию 2.

#include "../lib1/lib1.h" // 1

Это предполагает, что дерево всегда останется прежним.Поэтому, когда вы изменяете свою структуру, вам нужно будет изменить это везде.

#include "lib1/lib1.h"    // 2

Я не вижу, в чем проблема добавления src к пути включения.На самом деле вам даже не нужно добавлять src в путь включения, вы можете напрямую добавить src / lib1 и просто иметь #include "lib1.h"

#include <lib1/lib1.h>    // 3

Этот стиль включений используется для системных заголовков.Вам следует избегать этого, так как большинство программистов привыкли видеть windows.h или string или vector внутри <>.Вы также говорите компилятору сначала искать эти заголовки в каталогах по умолчанию, а не в ваших собственных.Я бы избегал этого.

Примечание:

Вы должны подумать о такой структуре:

src
  +-- lib1
    +-- lib1.h
  +-- lib2
   +-- lib2.h
include

где include каталог содержит все общедоступные заголовки.Если lib1.h публично, переместите его туда.Если нет, то ваша структура должна быть в порядке.

...