Я идеально хотел бы смочь добавить (очень повторяющийся) код C/C++ к своему фактическому коду, но во время компиляции, в коде, который прибудет из, говорится, stdout сценария Python, тот же способ, которым каждый делает с макросами.
Например, скажем, я хочу иметь функции, которые зависят от общедоступных атрибутов данного класса, способность просто записать, что следующее в моем коде C++ было бы благословением:
generate_boring_functions(FooBarClass,"FooBarClass.cpp")
То выполнимое использующее стандартное средство? Или я должен взломать с Make-файлами и временными исходными файлами?
Спасибо.
Скорее всего, вам нужно немного подправить Makefile. Было бы легко написать скрипт (Python), который считывает каждый из ваших исходных файлов в качестве дополнительного шага предварительной обработки, заменяя экземпляры generate_boring_functions
(или любого другого скрипта-макроса) правильным кодом, возможно, просто вызов generate_boring_functions.py
с правильными аргументами и устранение необходимости во временных файлах путем отправки исходного кода компилятору через стандартный ввод.
Блин, теперь я хочу сделать что-то подобное.
Изменить: Такое правило, застрявшее в make-файле, может использоваться для обработки дополнительного шага сборки. Это не проверено и добавлено только для некоторой полноты картины.
%.o : %.cpp
python macros.py $< | g++ -x cpp -c - -o $@
Вы можете попробовать библиотеку препроцессора Boost. Это просто расширение обычного препроцессора, но если вы проявите творческий подход, вы можете добиться в нем почти всего.
Я никогда не использовал эту конкретную технологию, но похоже, что вы ищете что-то вроде инструмента Cog Неда Батчелдера .
Сценарии Python встраиваются в исходный файл C ++, так что при запуске через инструмент cog генерируется дополнительный код C ++ для компилятора C ++. Таким образом, ваш процесс сборки будет состоять из дополнительного шага, на котором Cog создаст фактический исходный файл C ++ перед вызовом компилятора C ++.
Если makefile для вас недостаточно обычен, вы можете обойтись хитро написанными макросами.
class FooBarClass
{
DEFINE_BORING_METHODS( FooBarClass )
/* interesting functions begin here */
}
Я очень часто вижу, как это делается для реализации шаблонных частей классов COM.
Но если вам нужно что-то, что не является ни make
, ни макросом, тогда я не знаю, что вы можете иметь в виду.
Вы смотрели PythoidC ? Его можно использовать для генерации кода C.