Фильтровать C ++ через Perl-скрипт? - PullRequest
3 голосов
/ 26 июля 2009

У меня есть Perl-скрипт, который я хотел бы отфильтровать через мои файлы cpp / h, прежде чем gcc обработает их нормально - в основном, как дополнительный шаг предварительной обработки. Есть простой способ сделать это? Я понимаю, что могу передать файлы cpp в сценарий, и gcc прочитал вывод из stdin, но это не помогает с файлами заголовков.

Ответы [ 4 ]

2 голосов
/ 26 июля 2009

Как насчет оболочки вокруг gcc, которая запускает ваш Perl-скрипт и затем вызывает gcc? Назовите это как plgcc и установите CC=plgcc в вашем make-файле. Ваш сценарий должен быть достаточно умен для обработки директив включения - если только ваш сценарий не вызывает только препроцессор для включения включений, делает свое дело и затем вызывает gcc.

2 голосов
/ 26 июля 2009

GCC позволяет использовать собственный препроцессор. Вы можете установить свой скрипт в качестве препроцессора, а затем запустить вывод через cpp (обычный препроцессор gcc). Посмотрите руководство gcc для параметров командной строки -B и -no-integrated-cpp.

Предупреждение - я никогда сам не пробовал, поэтому не знаю, насколько это может быть грязно (хотямногие годы многие языки, включая C ++, были реализованы в качестве препроцессоров для компилятора переменного тока, поэтому поддержка не должна быть слишком плохой).

2 голосов
/ 26 июля 2009

Препроцессор C и C ++ не поддерживает подобные вещи. Единственный способ справиться с этим - заставить ваш make-файл (или любой другой) обрабатывать все файлы с помощью сценария perl перед вызовом компилятора. Это, очевидно, очень сложно, и это одна из очень веских причин не проектировать архитектуры, которые требуют такого шага. Что вы делаете, что заставляет вас думать, что вам нужен такой объект? Возможно, есть лучшее решение, о котором вы не знаете.

1 голос
/ 26 июля 2009

В прошлом я обрабатывал подобные случаи, делая что-то вроде следующего. В этом подходе предполагается, что необработанный исходный код можно отличить с помощью некоторой схемы именования, в данном случае добавляя базовое имя к _pp.

# These are your source files to be preprocessed
SRC_RAW = mysrc_pp.cpp

# These are the source files after preprocessing
SRC_PP = $(patsubst %_pp.cpp, %.cpp, $(SRC_RAW))

ALL_SRC = $(SRC) main.cpp other.cpp

OBJ = $(patsubst %.cpp, %.o, $(ALL_SRC))

$(SRC): %.cpp: %_pp.cpp 
        $(PERL) $< > $@

$(OBJ): %.o: %.cpp
        $(CXX) ...

Однако это не относится к случаю, когда выесть заголовочные файлы, которые требуют предварительной обработки. В этом случае вам понадобятся аналогичные правила для их создания.

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