У меня есть очень большое приложение, созданное с использованием 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 указывал бы на эту версию, а не на пустую. Однако я уверен, что это очень грубое решение, и я не уверен, что оно вообще сработает.
Может ли кто-нибудь предложить более элегантный метод глобального определения чего-либо или создания переменной таким образом, чтобы ее мог видеть каждый файл в решении?