@JustMoose
Программист. Радиолюбитель. Прокрастинатор ;)

Что делать с include-ами?

Всем привет.
В процессе ковыряния очередной фичи обнаружил, что мне жизненно не хватает чего-то вроде:
#include "my_dir//" + some_const_name + "//my_header.h"
void main() {
  use_it(my_const_from_header);
}

В общем, захотелось мне выбирать путь к хидеру во время компиляции, в зависимости от каких-то внешних условий (например, прокидывать some_const_name компилятору как параметр /D).

Погуглив я понял, что решения нет (не считая ада с define-ами, который решает проблему, но как-то очень некрасиво).

Потом я полез в википедию, конкретно в описание С++11/14/17 и понял, что плюсы развиваются в сторону темплейтов, библиотек и т.п. Про препроцессор там не было ни слова.
Единственное похожее, что я нашёл, это директива import, которую предлагают использовать вместо include. Но, увы, только для стандартной библиотеки.

Вопрос: есть ли решение моей проблемы? Правильно ли я понимаю, что препроцессор никто и никогда не будет развивать и, видимо, вскоре от него откажутся?

ЗЫ: Использую Visual Studio 2017.
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
terrier
@terrier
Ну, в C++ так не делают.
Вставлять результаты дефайнов в "#include" явно запрещено, хотя, может быть, было бы и полезно.
Если вам это действительно сильно нужно - используйте предварительную кодогенерацию, пройтись скриптом по исходникам и подменить какой-нибудь "$placeholder$" на определенную some_const_name должно быть несложно.

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

Нет, пока жив C++, жив и препроцессор.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@res2001
Developer, ex-admin
Не правильно вы понимаете. Директивы препроцессора используются практически в любом проекте на С/С++. Посмотрите заголовочные файлы стандартной библиотеки. Темплейты - это про другое.
ада с define-ами

Это сильно преувеличено.
Пример использования:
1. При компиляции устанавливаете через опцию компилятора /D свой define: /Dsome_const_name
2. В коде:
#ifdef some_const_name
#include "my_header.h"
#else
#include "my_other_header.h"
#endif

3.Все
Ответ написан
Punk_Joker
@Punk_Joker
Software Engineer в ВО Овен
Просто передавайте компилятору путь, где искать хедеры, вот и все
Ответ написан
Комментировать
@anikavoi
Не делайте так. Пожалейте тех, кто будет смотреть ваш код после вас. Вполне возможно, что это будете вы же, но старше :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы