Каковы преимущества относительного пути такой как “../include/header.h” для заголовка?

Абстракция - это большая тема, которую было бы сложно быстро охватить. Тем не менее, ваша программа - это один длинный метод, который, без сомнения, может быть переработан в более объектно-ориентированный дизайн.

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

Выражение if может состоять из нескольких частей, поэтому:

if (numberFirst > 3) {
     System.out.println("You can't do that. Please start over.");
     System.out.close();
}
if (numberFirst < 2) {
     System.out.println("You can't do that. Please start over.");
     System.out.close();
}

можно упростить до:

if ((numberFirst > 3) || (numberFirst < 2)) {
    System.out.println("You can't do that. Please start over.");
    System.out.close();
}

Если операторы могут быть вложенными, то:

[ 112]

можно упростить до:

if (numberFirst == 3) {
    if (operation.equals("1"))
         System.out.println("You are using addition." + " Your answer is " + (num1 num2 + num3) + ".");
     if (operation.equals("2"))
        System.out.println("You are using subtraction." + " Your answer is " + (num1 - num2 - num3) + ".");
    ...
}

Я мог бы продолжать. Лучше всего изучать основные функции языка Java, например. циклы, switch операторы, массивы и так далее. Тогда вы сможете упростить еще больше.

53
задан Community 23 May 2017 в 01:54
поделиться

5 ответов

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

#include "Physics/Solver.h"

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

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

39
ответ дан Andrew Grant 7 November 2019 в 08:46
поделиться

Проблема с #include "../include/header.h" состоит в том, что это будет часто работать случайно, и затем на вид несвязанное изменение заставит его прекратить работать позже.

, Например, рассмотрите следующее исходное расположение:

./include/header.h
./lib/library.c
./lib/feature/feature.c

И скажем, что Вы запускаете компилятор с включать путем -I. -I./lib. Что происходит?

  • ./lib/library.c может сделать #include "../include/header.h", который имеет смысл.
  • ./lib/feature/feature.c может также сделать #include "../include/header.h", даже при том, что это не имеет смысла. Это вызвано тем, что компилятор попробует #include директива относительно местоположения текущего файла, и если это перестанет работать, то это попробует #include директива относительно каждого -I запись в эти #include путь.

, Кроме того, если Вы позже удаляете -I./lib из эти #include путь, тогда Вы повреждаетесь ./lib/feature/feature.c.

я нахожу, что что-то как следующее предпочтительно:

./projectname/include/header.h
./projectname/lib/library.c
./projectname/lib/feature/feature.c

я не добавил бы, что любой включает записи пути кроме [1 115], и затем и library.c и feature.c использовал бы #include "projectname/include/header.h". Предполагая, что "projectname", вероятно, будет уникален, это не должно приводить к коллизиям имени или неоднозначностям при большинстве обстоятельств. Можно также использовать включать путь и/или make's VPATH функция для разделения физического расположения проекта через несколько каталогов если абсолютно необходимый (для размещения определенного для платформы автоматически сгенерированного кода, например; это - что-то, что действительно ломается, когда Вы используете #include "../../somefile.h").

24
ответ дан bk1e 7 November 2019 в 08:46
поделиться

IANALL, но я не думаю, что необходимо помещать .. в фактический C или исходные файлы C++, потому что это не портативно, и стандарт не поддерживает его. Это подобно использованию \ в Windows. Только сделайте это, если Ваш компилятор не может работать ни с каким другим методом.

9
ответ дан Jonathan Leffler 7 November 2019 в 08:46
поделиться

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

я избежал бы путей как:

  • "include/foo/bar.h" — "включение" кажется нелогичным и избыточным
  • "../foo/bar.h" — ".." принимает относительное местоположение и хрупок
  • "bar.h" —, если bar.h не находится в текущем каталоге, это загрязняет глобальное пространство имен и просит неоднозначности.

Лично, я склонен добавлять, что путь как следующее к моим проектам включает путь — "..;../..;../../..;../../../..".

Это позволяет Вам применять своего рода правило сокрытия к Вашему #include с и позволяет некоторую свободу движущихся заголовков, не взламывая другой код. Конечно, это за счет представления риска привязки к неправильному заголовочному файлу, если Вы не осторожны, как неполностью определенные имена могут быть (или становиться со временем), неоднозначный.

я склонен полностью определять #include с в общедоступных заголовках, таким образом, любые третьи лица, использующие мой код, не должны добавлять "..;../..;../../..;../../../.." к своему проекту —, это - просто удобство для моей частной системы кодов и системы сборки.

2
ответ дан Jonathan Leffler 7 November 2019 в 08:46
поделиться

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

1
ответ дан Joel Coehoorn 7 November 2019 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: