Генерация кода во время компиляции с использованием скриптов

в идеале я хотел бы иметь возможность добавлять (очень повторяющийся) код 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 ни макро, тогда я не знаю, что вы могли бы иметь в виду.


makefile (или эквивалент) является" обычным " средством!


Я никогда не использовал эту конкретную технологию, но похоже, что вы ищете что-то вроде винтик Неда Батчелдера.

скрипты Python встроены в исходный файл c++, так что при запуске через инструмент cog создается дополнительный код C++ для компилятора C++. Таким образом, ваш процесс сборки будет состоять из дополнительного шага, чтобы cog произвел фактический исходный файл C++ до вызова компилятора C++.


вы можете попробовать библиотеку препроцессоров Boost. Это просто расширение обычного препроцессора, но если вы креативны, вы можете достичь почти всего в нем.


вы посмотрели на PythoidC ? Его можно использовать для генерации кода C.