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