LINUX.ORG.RU

Си + M4

 , ,


1

2

Читал, что люди прикручивают M4 к C/C++, чтобы получить более гибкий препроцессинг и делать всякие интересные вещи. Но почему-то никто не рассказывает, как он это сделал.

Проблема первая - от штатного препроцессора Си отказаться нельзя, потому что все системные заголовочные файлы используют его. Переписывать с нуля stdlib.h и прочие занятие плохое, тем более что они разные на разных платформах и даже версиях компилятора.

Решение - вызывать cpp до или после m4.

Проблема вторая - мы ведь хотим по-прежнему видеть красивые сообщения об ошибках с правильным указанием строки, где она случилась?

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

Проблема третья - при вызове двух препроцессоров подряд метки строк вступят в конфликт. Нет, конечно, файл скомпилится, однако информация о номерах строк станет странной.

Как решить эту проблему? Я вижу два возможных решения:

1) Как-то заставить M4 эмулировать CPP. Возможно, написав несколько макросов (однако вроде как нельзя объявлять макросы, начинающиеся с #, точнее можно, но вызывать их нужно по-особому).

2) Как-то сделать так, что номера строк будут сохранять актуальность.

UPD: Хорошая новость - CPP понимает метки строк, поставленные до него. То если запускать CPP после M4, метки строк будут верными. Я выяснил это эмпирически. Можно получить доказательство, что это так? Однако получается, что m4 не будет применяться к файлам, которые мы инклюдим с помощью #include. Окей. Допустим, во всём проекте будет использоваться m4_include для всех модулей. Однако как теперь определять зависимости сборки? Сейчас я использую gcc -MM.

★★★★★

Последнее исправление: KivApple (всего исправлений: 1)

Ответ на: комментарий от anonymous

Запилить подобие наследования для структур, чтобы ООП-style код не превращался в такую лапшу как код, использующий GLib. Ну это лично я хочу. Для чего используют M4 с Си другие не знаю.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от KivApple

Есть книга, в которой делают ООП в Си, в качестве препроцессора там юзали awk.

anonymous
()
Ответ на: комментарий от KivApple

Запилить подобие наследования для структур, чтобы ООП-style код не превращался в такую лапшу как код, использующий GLib

А С++ чем не подходит?

Begemoth ★★★★★
()
Ответ на: комментарий от KivApple

Алсо, если тебе не надо множественное наследование, то препроцессор не нужен. Используй обертывание, это как в BuguRTOS.

anonymous
()

Проблема первая - от штатного препроцессора Си отказаться нельзя, потому что все системные заголовочные файлы используют его. Переписывать с нуля stdlib.h и прочие занятие плохое, тем более что они разные на разных платформах и даже версиях компилятора.

Можно, если конвертнуть заголовочные файлы

SZT ★★★★★
()

Я выяснил это эмпирически. Можно получить доказательство, что это так?

Если речь про директиву #line, то вроде бы везде должна быть. gcc/clang/MSVC по крайней мере ее поддерживают

во всём проекте будет использоваться m4_include для всех модулей

Можно прогнать через пре-препроцессор. Преобразовать #include в m4_include (или во что-то более развесистое), потом уже препроцессить код

Deleted
()

Однако получается, что m4 не будет применяться к файлам, которые мы инклюдим с помощью #include.

Накладывай m4 и сохраняй в отдельный каталог. Потом компилируй как обычный код на Си.

PS: Я использовал erb перед сишным препроцессором. По мне, ruby не такой ужасный, как m4.

NeXTSTEP ★★
()

Фееричный велосипедиотизм.

Pavval ★★★★★
()

Если у тебя есть M4, то можно обойтись и без Си :)

annulen ★★★★★
()

Какой практический смысл в том что ты задумал? Не «всякие интересные вещи», а конкретно?

invy ★★★★★
()
Ответ на: комментарий от KivApple

Запилить подобие наследования для структур, чтобы ООП-style код не превращался в такую лапшу как код, использующий GLib.

Чего только люди не придумают, чтобы на c++ не писать.

// На C++, если что, можно писать без STL.

hobbit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.