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

Я идеально хотел бы смочь добавить (очень повторяющийся) код C/C++ к своему фактическому коду, но во время компиляции, в коде, который прибудет из, говорится, stdout сценария Python, тот же способ, которым каждый делает с макросами.

Например, скажем, я хочу иметь функции, которые зависят от общедоступных атрибутов данного класса, способность просто записать, что следующее в моем коде C++ было бы благословением:

generate_boring_functions(FooBarClass,"FooBarClass.cpp")

То выполнимое использующее стандартное средство? Или я должен взломать с Make-файлами и временными исходными файлами?

Спасибо.

6
задан Manux 17 June 2010 в 17:22
поделиться

6 ответов

Скорее всего, вам нужно немного подправить Makefile. Было бы легко написать скрипт (Python), который считывает каждый из ваших исходных файлов в качестве дополнительного шага предварительной обработки, заменяя экземпляры generate_boring_functions (или любого другого скрипта-макроса) правильным кодом, возможно, просто вызов generate_boring_functions.py с правильными аргументами и устранение необходимости во временных файлах путем отправки исходного кода компилятору через стандартный ввод.

Блин, теперь я хочу сделать что-то подобное.

Изменить: Такое правило, застрявшее в make-файле, может использоваться для обработки дополнительного шага сборки. Это не проверено и добавлено только для некоторой полноты картины.

%.o : %.cpp
    python macros.py $< | g++ -x cpp -c - -o $@
4
ответ дан 9 December 2019 в 22:29
поделиться

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

0
ответ дан 9 December 2019 в 22:29
поделиться

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

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

2
ответ дан 9 December 2019 в 22:29
поделиться

Если makefile для вас недостаточно обычен, вы можете обойтись хитро написанными макросами.

class FooBarClass
{
    DEFINE_BORING_METHODS( FooBarClass )

    /* interesting functions begin here */
}

Я очень часто вижу, как это делается для реализации шаблонных частей классов COM.

Но если вам нужно что-то, что не является ни make, ни макросом, тогда я не знаю, что вы можете иметь в виду.

3
ответ дан 9 December 2019 в 22:29
поделиться

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

0
ответ дан 9 December 2019 в 22:29
поделиться

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

2
ответ дан 9 December 2019 в 22:29
поделиться