Могу ли я установить флаг времени компиляции, чтобы включить заголовок? - PullRequest
4 голосов
/ 16 августа 2011

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

Отдельные версии этого класса содержатся в отдельных подпапках.

ех.

  • главная / config.h

  • основной / config.cpp

  • среднее / config.h

  • среднее / config.cpp

Есть ли хороший способ, с помощью флага времени компиляции или опции командной строки, чтобы сборка определяла, какой заголовок / cpp использовать? У меня уже есть несколько конфигураций, и я надеюсь, что в будущем их будет еще больше. Я хотел бы избежать длинного списка # ifdef / # elif / # elif / etc ..

edit: я бы хотел избежать отдельных сборок и не использовать #defines во всем коде. Извините, если я не прояснил это раньше! > _ <</p>

Ответы [ 7 ]

2 голосов
/ 16 августа 2011

В зависимости от используемой вами системы сборки вы можете создать переменную, которая будет указывать на основной или дополнительный путь.Затем эта переменная используется для добавления к пути INCLUDE, чтобы все ваши источники могли просто #include "config.h", когда им нужен доступ к конфигурации.В вашем Makefile (или эквивалентном) вам необходимо добавить $CONFIGPATH/config.cpp к вашим источникам для сборки.

MSBuild

Обновить пути к исходным файлам:

<ItemGroup>
    <ClCompile Include="main.cpp" />
    <ClCompile Include="$(ConfigToUse)/config.cpp" />
</ItemGroup>
<ItemGroup>
     <ClInclude Include="$(ConfigToUse)/config.h" />
</ItemGroup>

И включаемый путь:

<PropertyGroup>
    <ConfigurationType>Application</ConfigurationType>
    <ShowAllFiles>false</ShowAllFiles>
    <IncludePath>...;$(ConfigToUse);</IncludePath>
</PropertyGroup>

Затем позвоните msbuild build.xml /p:ConfigToUse=PathToConfig

2 голосов
/ 16 августа 2011

Директива #include на самом деле не заботится о содержимом.

Вы также можете легко использовать класс-заглушку, который вы используете в своем проекте:

stub.cpp

#ifdef BUILD1
    #include "main/realimpl1.cpp"
#else
    #include "secondary/realimpl2.cpp"
#endif

И, конечно, вы можете сделать то же самое с заголовками, если это необходимо.

0 голосов
/ 16 августа 2011

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

Вы можете изменить путь включения компилятора с помощью некоторой опции компилятора (это зависит от компилятора).

Для файла .cpp это то же самое.Просто имейте файл .cpp в вашем обычном исходном дереве, который включает этот файл .cpp через директиву #include.

Cheers & hth.,

0 голосов
/ 16 августа 2011

В Visual Studio (если это ваша IDE) у вас может быть несколько «конфигураций» (по умолчанию Debug и Release), и возможно, что некоторые файлы не будут включены в каждую сборку. Вы можете сделать конфигурацию «Debug main», которая исключает файл second / config.cpp, и конфигурацию «Debug second», которая исключает main / config.cpp. Если вы используете не Visual Studio, я думаю, что есть способ сделать что-то подобное с make-файлами.

0 голосов
/ 16 августа 2011

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

Вы можете поместить общие файлы в общий каталог, а другие файлы - в отдельные каталоги - по одному каталогу для каждой конфигурации.

0 голосов
/ 16 августа 2011

Вы можете использовать время компиляции #define, например

#define USE_BUILD_X 1
//#define USE_BUILD_Y 1    
...
...
#ifdef (USE_BUILD_X)
#include "mainheader.h"
#elif (USE_BUILD_Y)
#include "secondheader.h"
#endif
0 голосов
/ 16 августа 2011

Вы можете поместить в свой заголовок / cpp стражу так:

#ifdef OPTION_A

...

#endif
...