Добавление возможности предварительной обработки C/C++ в вашу программу

У меня есть программа на С++, которая обрабатывает входной файл. Я хочу добавить возможность предварительной обработки в свою программу. То есть входной файл выглядит так:

%pre-processing section
#include <some_parent_file>
#define x y
#ifdef 0
some useless text
#endif

%actual file-contents
... lots of text ...

Затем моя программа должна автоматически включать текст из родительского файла, выполнять #define и другую предварительную обработку. Я мог бы использовать сценарий (с g++ -E) перед вызовом моей программы, но я хотел бы иметь возможность сделать это в своей программе, поскольку это обеспечивает большую гибкость.

Также «g++ -E» будет предполагать директиву препроцессора, когда строки в разделе «фактическое содержимое файла» начинаются с хэша (g++ -E не знает, что я хочу разделить свой код на 2 раздела!).

Более того, если бы я мог использовать просто функциональность ifdef в разделе "фактическое содержимое файла", это было бы потрясающе.

Могу ли я внедрить код C++ в свою программу, чтобы использовать только те функции, которые мне нужны от возможностей предварительной обработки компилятора gcc?


person Karan    schedule 01.12.2011    source источник
comment
У вас есть конкретный вопрос?   -  person Laurence Gonsalves    schedule 01.12.2011
comment
Просто пусть ваша программа создаст процесс для запуска g++ -E в предоставленном файле и обработает результат.   -  person Ira Baxter    schedule 01.12.2011
comment
Пока вы не слишком увлекаетесь своими макросами, все это выглядит довольно просто для реализации. Каков твой вопрос?   -  person Joe McGrath    schedule 01.12.2011
comment
Как сложно вы хотите получить? Недавно я реализовал собственную функциональность для #if, #else, #elif и #endif, а также добавил базовую булевскую поддержку для && и ||. #include было бы тривиально. #define было бы сложно в зависимости от того, насколько сложным может быть ваш ввод.   -  person Jim Buck    schedule 01.12.2011
comment
да, я могу реализовать это с нуля, но не хочу заново изобретать велосипед...   -  person Karan    schedule 01.12.2011
comment
Я думаю, что препроцессор GCC — это библиотека в исходниках GCC. Может быть, это можно использовать?   -  person Some programmer dude    schedule 01.12.2011


Ответы (3)


Как насчет библиотеки типа Wave или cpplib?

person Jim Buck    schedule 01.12.2011

Простой возможностью было бы использовать popen для чтения из командной строки, которая может быть cpp (или gcc -C -E) или m4.

Связанная с этим возможность состоит в том, чтобы встроить интерпретатор сценариев в вашу программу, например. lua. Похожим решением является сделать приложение встроенным в интерпретатор, например Python или Ocaml.

Наконец, вы можете использовать обычный лексинг и методы анализа, возможно, с помощью ANTLR и обработки самостоятельно ваши директивы включения. Вы также можете использовать библиотеку для файлов конфигурации, например libconfig.

person Basile Starynkevitch    schedule 01.12.2011
comment
Цель состоит в том, чтобы НЕ ИСПОЛЬЗОВАТЬ СЦЕНАРИИ и НЕ ЗАПИСЫВАТЬ ВСЕ С НУЛЯ в С++, поскольку это уже может делать компилятор gcc (я не хочу проверять пути включения и т. д.). По сути, есть ли способ сделать это в С++ (используя системные вызовы или что-то подобное), который позволяет мне использовать только те функции предварительной обработки, которые мне нужны. - person Karan; 01.12.2011
comment
Компилятор GCC не участвует вообще при запуске вашего приложения (если только вы не вызываете его через popen, system или execve). Он используется только для сборки исполняемого файла... - person Basile Starynkevitch; 01.12.2011

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

person npclaudiu    schedule 01.12.2011