Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Общерешение определяет в Visual Studio?

Автор вопроса: Alex JansenОтветов: 1

У меня есть очень большое приложение, созданное с использованием Visual Studio 2008, которое предназначено для работы в Windows XP. Код состоит из одного файла решения, который содержит шесть отдельных проектов. Моя работа состоит в том, чтобы портировать это приложение для работы в Linux. Я не делал ничего подобного раньше.

Вчера я обнаружил, что моя компания хочет, чтобы этот код по-прежнему компилировался в Windows, когда я закончу с ним. Моя первая идея для достижения этого состоит в том, чтобы использовать оператор препроцессора, такой как:

#define COMPILE_FOR_LINUX

Затем я мог бы указать компилятору, какие файлы включать в заголовки, используя такие блоки препроцессора:

#ifdef COMPILE_FOR_LINUX
// include required Linux headers here and skip Windows header includes
#else
// include required Windows headers here and skip Linux header includes
#endif

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

#ifdef COMPILE_FOR_LINUX
// compile Linux specific code used here.
#else
// compile Windows specific code used here.
#endif

Чтобы кому-то было как можно проще скомпилировать приложение для предпочтительной платформы, я бы хотел, чтобы COMPILE_FOR_LINUX был указан только в одном месте. Однако я не уверен, как это сделать.

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

Может ли кто-нибудь предложить более элегантный метод глобального определения чего-либо или создания переменной таким образом, чтобы ее мог видеть каждый файл в решении?

  • На всякий случай другие люди ищут это: stackoverflow.com/questions/5268177/ Peter M 27.07.2016

c++linuxglobal-variablesportingvisual-studio-2008

Ответы

Ответ 1 · рейтинг 2 · Luchian Grigore

Это зависит от используемого вами компилятора, но для gcc вы можете указать директивы препроцессора из командной строки, поэтому вам просто нужно добавить COMPILE_FOR_LINUX в ваш make-файл.

g++ -DCOMPILE_FOR_LINUX .....

Для окон, если вы используете MSVS, вы можете изменить вкладку Preprocessor directives в свойствах проекта (на самом деле вам не нужно, так как COMPILE_FOR_LINUX не определено, но вы можете добавить COMPILE_FOR_WINDOWS для согласованности).

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы