Генерация кода во время компиляции с использованием скриптов - PullRequest
6 голосов
/ 17 июня 2010

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

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

generate_boring_functions(FooBarClass,"FooBarClass.cpp")

Это возможно с использованием обычных средств?Или я должен взломать Makefiles и временные исходные файлы?

Спасибо.

Ответы [ 6 ]

4 голосов
/ 17 июня 2010

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

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

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

%.o : %.cpp
    python macros.py $< | g++ -x cpp -c - -o $@
3 голосов
/ 17 июня 2010

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

class FooBarClass
{
    DEFINE_BORING_METHODS( FooBarClass )

    /* interesting functions begin here */
}

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

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

2 голосов
/ 17 июня 2010

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

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

2 голосов
/ 17 июня 2010

Makefile (или его эквивалент) является «обычным» средством!

0 голосов
/ 17 июня 2010

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

0 голосов
/ 17 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...