Я рассмотрел вопросы How to use include directive correctly и C++ #include semantics и ни адреса этого - и не другие предложенные SO, когда я напечатал название ...Каковы преимущества относительного пути, например «../include/header.h» для заголовка?
Что, если таковой имеется, преимущество написания:
#include "../include/someheader.h"
#include "../otherdir/another.h"
по сравнению с использованием только обычного имени файла:
#include "someheader.h"
#include "another.h"
или, возможно относительное имя без «..
»:
#include "include/someheader.h"
#include "otherdir/another.h"
Проблемы, которые я вижу, являются:
- Вы не можете переместить заголовок, не заботясь о том, какие исходные файлы включают его.
- Вы можете получить очень длинные пути для заголовков в зависимостях и отчетах об ошибках. У меня был один сегодня с «
../dir1/include/../../include/../dir2/../include/header.h
».
Единственная заслуга, я могу видеть, что в то время как вам не нужно перемещать файлы, вы можете быть в состоянии уйти без всегда использовать «-I
» директивы, чтобы найти заголовки, но потеря гибкости и сложность компиляции в под-подкаталогах и т. д., кажется, перевешивает выгоду.
Итак, я не вижу преимущества?
Спасибо за ввод. Я думаю, что консенсус в том, что нет никаких существенных преимуществ для нотации, использующей «..», которую я пропускаю. В общем, мне нравится нотация «где-то/header.h»; Я использую его в новых проектах. Тот, над которым я работаю, является чем-то новым.
Одна из проблем состоит в том, что существуют различные наборы заголовков, часто с префиксом, такие как rspqr.h
, rsabc.h
, rsdef.h
, rsxyz.h
. Все они связаны с кодом в каталоге rsmp
, но некоторые из заголовков находятся в rsmp
, а другие находятся в центральной директории include, в которой нет подкаталогов, таких как rsmp
. (И повторите для разных других областей кода, есть заголовки в нескольких местах, которые необходимо случайным образом выполнять с помощью других битов кода.) Перемещение материала вокруг является серьезной проблемой, потому что код стал настолько запутанным на протяжении многих лет. И make-файлы несовместимы, в которых предусмотрены опции -I
. В целом, это печальная история о не столь благожелательном пренебрежении в течение нескольких десятилетий. Фиксация всего этого, не нарушая ничего, будет длительной, утомительной работой.
Вы, кажется, знаете все факторы, поэтому это не вопрос. – shoosh
Я проверяю, есть ли льготы, которые я забыл (потому что я ненавижу нотацию, но страдаю от этого на работе). У меня меньше проблем с обозначением без «..» в нем. –
Это (с использованием относительных путей) имеет тенденцию приводить к огромным головным болям при использовании отдельной сборки. I.e cd yourproject; mkdir build; cd build; ../configure && make - Если вы собираетесь продолжать поддерживать код, возможно, стоит исправить это. –