Tesla4o
@Tesla4o
Без пользы жизнь - безвременная смерть... В. Гете

Как правильно пользоваться разделителем кода для Windows и linux?

Есть код, который работает под linux и должен работать на Windows. некоторые участки кода работают только на linux. Поэтому приходится переписывать их для Windows. Чтобы не делать отдельные проекты пишу таким образом:
#ifdef _WIN32
    // code for win
#elif __linux__
    // code for linux
#endif

Посоветуйте, так нормально или это можно сделать лучше?
  • Вопрос задан
  • 3425 просмотров
Решения вопроса 4
@vanyamba-electronics
Рекомендуется делать два разных проекта.
Смысл в чём. Вся логика приложения пишется на скриптах, а под разные операционные системы используются разные интерпретаторы.
Это позволяет код приложения сделать единым, а алгоритмы интерпретатора оптимизировать.
Ответ написан
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Да, это нормальный подход. Но такой код необходимо хорошо изолировать за кросс-платформенными интерфейсами. Так будет легче поддерживать проект, ну или использовать кросс-платформенные библиотеки в дальнейшем.
Ответ написан
Комментировать
@rPman
Смотрите чем вы будете собирать, так как различия могут появиться в зависимости от инструмента, например собирая под cygwin/mingw/visualstudio может потребоваться менять код, и сильно.

Дефайны могут отличаться в зависимости от использованных инструментов для сборки, а то может у вас scons и сами дефайны определяются в скриптах или makefile, как ВАМ пожелается, хотите _WIN32_ хотите WINDOWS хотите как угодно...
Ответ написан
Комментировать
@Pardych
Первый комментатор со своим предложением скриптов в целом транслирует частный случай верной архитектуры, но, видимо в силу еще слабого технического кругозора несколько категорично.
Суть в чем - у вас есть логический модуль отвечающий за ос-зависимый код. У него есть интерфейс. Вы делаете два класса/модуля которые этот самый интерфейс реализуют. Дальнейший вопрос это как давать вашему приложению экземпляр этого интерфейса для использования. Можно создавать в рантайме, полагаясь на выбор ос (это ваш вариант, он же вариант с инверсией контроля, когда обе имплементации интерфейса доступны для приложения в любой момент и создаются во время работы каким-то внутренним механизмом выбирающим их на основе текущей ос), однако чаще это делается в компайл-тайме, проект при этом один, но дробится на проект аппа содержащий вашу абстрактную логику без привязки к системе + столько проектов ос/платформенно зависимых реализаций библиотеки сколько вам нужно. В той же джаве например проекты библиотек оформляются модулями основного проекта с использованием автосборщиков градл или мавен. В случае си и си++ инструменты у вас будут свои. Конечный результат правильно организованной сборки представляет собой набор дистрибутивов для конкретных платформ лишенный "лишнего" - в каждый конкретный дистрибутив идет только то что ему нужно для целевой платформы. Подобный подход так же работает для проектов с разными языками, поскольку множество языков умеет в интероп с нативными библиотеками. В таких случаях абстрактный слой (бизнес-логику) делают общей кодовой базой и пишут ее на чем удобно и что больше подходит для целей приложения. Это и есть частный случай из комментария 1. Если нет желания баловаться с интеропом то и не нужно, выбираете удобный инстурмент автоматизации вашей сборки, аккуратно отделяете свой абстрактный слой от платформенно-зависимого и вперед.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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