Скомпилировать C с подкаталогом на основе константы компилятора
Я хочу создать программу, которая включает в себя исходные файлы и файлы заголовков из подкаталога в дополнение к основному каталогу. Имя подкаталога и части самих имен файлов должны быть выбраны с помощью константы компилятора. Вот пример дерева файлов.
=main.h
=main.c
=anotherfile.h
=anotherfile.c
=A
---= A_file1.h
---= A_file1.c
---= A_file2.h
=B
---= B_file1.h
---= B_file1.c
---= B_file2.h
Каждая компиляция включает в себя главный и другой файлы, которые ссылаются на X_file1 и X_file2, где "X" выбирается во время сборки или с константой. Таким образом, проект может быть построен с использованием файлов A или B.
Итак, как это реализовать (и каков "лучший" способ)? Можно ли поместить ссылку на константу компилятора в оператор #include? (что-то вроде #include X+"/"+"x+"_file1.h) Или есть другой способ?
Я новичок в системах сборки C и препроцессоре, поэтому извиняюсь, если это плохой вопрос. Поисковые системы не сильно помогли.
1 ответ
как это реализовать?
В любом случае, я бы побежал к системе сборки. Настройте систему сборки для многократной компиляции файла с другим определением макроса, указывающим на файл. Грубый пример:
// main.c
#include IMPL
А затем, например, с системой сборки CMake:
add_executable(file1 main.c file1.c)
target_compile_definitoins(file1 PUBLIC "IMPL=\"file1.h\"")
add_executable(file2 main.c file2.c)
target_compile_definitions(file1 PUBLIC "IMPL=\"file2.h\"")
# etc..
В целом такой подход кажется неправильным и запутанным. Настоятельно рекомендуется переписать приложение, чтобы все файлы можно было скомпилировать вместе, а все символы были уникальными. Это облегчит написание и поможет IDE перейти к правильному определению функции и уменьшит головную боль.
Если вы боретесь с предоставлением нескольких реализаций для одного и того же интерфейса, есть решение — реализовать объект интерфейса с указателями на функции. Затем выберите правильную реализацию с помощью конструктора или фабрики, которая создает объект с виртуальными интерфейсами.