Должен ли я использовать относительные пути include для моего проекта или разместить каталог include на пути включения?
В моем проекте в настоящее время я использую относительные пути для включения моих файлов, которые, по общему признанию, не часто меняются. Тем не менее, он дает довольно странные шаблоны включения, потому что я обычно вложенные файлы в много папок.
Например, в моем текущем проекте у меня есть network/server/myfile.hpp
. Он должен включать common/log.hpp
. Текущий я использую #include "../../common/log.hpp"
, который довольно многословный, но работает.
Если я вместо этого добавлю свой основной каталог include в путь, я мог бы просто включить "common/log.hpp"
.
Я знаю, что этот вопрос может быть более предпочтительным, чем что-либо еще, но есть ли какие-либо объективные плюсы и минусы в отношении приложений с кросс-платформой и что такое соглашения на С++?
Ответы
Ответ 1
Относительный включает в себя пути с ..
в нем выглядят немного уродливыми и ожидает определенную структуру файловой системы, то есть "../../common/log.hpp"
- это две папки вверх. Имеет смысл избегать ненужных зависимостей вообще и от структуры файловой системы в частности, поэтому перемещение файла заголовка из одного каталога в другой не заставляет вас обновлять все исходные файлы, содержащие этот заголовок.
Кроме того, элегантно, чтобы ваши входящие элементы соответствовали пространствам имен и классам. Если, например, у вас есть:
namespace foo { namespace bar { struct Baz; } }
Удобно и интуитивно, чтобы включить его как:
#include "foo/bar/Baz.h"
Ответ 2
Имея #include <common/log.hpp>
в исходном файле и имеющий путь к common/log.hpp
в ваших настройках проекта (параметры компилятора), вы защищаете свой исходный код от изменений в случае, когда common/log.hpp
перемещается в другое место, поэтому я рекомендую это подход. Обратите внимание, что в этом случае используются угловые скобки - компилятор должен искать заголовок в каталогах, какие пути задаются опцией компилятора /I
.
Ответ 3
Я всегда стараюсь сделать мои проекты независимыми от местоположения. Если я работаю на новом компьютере/платформе, я хочу иметь возможность компилировать и продолжать работать с минимальной необходимой настройкой. Поскольку вы задаете субъективный вопрос, мой субъективный ответ будет состоять в том, что я определенно предпочитаю использовать относительные пути.
Ответ 4
Никаких КОНВЕНЦИЙ как таковых, вы можете сделать это в любом случае, как вы предпочитаете.
Я имею в виду, если вы хотите сохранить это аккуратно хотя затем, очевидно, пойти на 2-й вариант, я бы пошел на второй одна из причин, почему вы не должны переместите валун, но всего несколько файлов, говорят основные.
И, кроме того, относительные пути предоставляют вам свободу для вашего приложения, поэтому просто выполните:)
Ответ 5
У меня есть правило, что каждый отдельный компонент может не использовать более одного каталога, а этот компонент имеет каталоги зависимых компонентов в пути включения.
Таким образом, каждый компонент использует свои собственные файлы include с синтаксисом ""
, а другие компоненты включают в себя использование <>
, который прекрасно избегает неприятных сюрпризов одним компонентом, используя заголовок, который была установлена последней развернутой версией в системе вместо дерева исходного дерева; он также имеет приятный эффект, заставляя меня вначале компоновать мои проекты.