Синтаксический анализ инструкций препроцессора C ++ #if

StackOverflow https://stackoverflow.com/questions/287379

Вопрос

У меня есть исходный файл на C / C ++ с условной компиляцией.Прежде чем я отправлю его клиентам, я хочу удалить большую часть операторов #if, чтобы моим клиентам не нужно было беспокоиться о передаче правильных параметров компилятору.

У меня это реализовано и работает на Python, но он правильно обрабатывает только операторы #ifdef и #ifndef .Мне нужно добавить поддержку операторов #if, но синтаксис #if намного сложнее.(Например.вы можете использовать &&, ||, !, скобки, операторы отношения, арифметику и т.д.).

Существует ли какой-либо существующий код с открытым исходным кодом для анализа и оценки операторов #if?(Желательно на Python).

Единственная известная мне реализация - это GCC, и она слишком сложна для этой задачи.

Это было полезно?

Решение

Как Кейтб сказал, вы могли бы просто позволить препроцессору сделать это за вас.

Но если вы не пытаетесь что-то скрыть (т. Е. в условно скомпилированном коде могут быть вещи, которые вы не хотите или которым не разрешено передавать кому-либо еще), гораздо более простым вариантом было бы просто поместить правильное #define директивы в заголовке, включенном глобально.

  • вашим клиентам не нужно беспокоиться о -D Опции
  • вам не обязательно выполнять какой-то пользовательский этап в процессе сборки
  • код, который вы предоставляете своим клиентам, потенциально не является наполовину запутанным
  • вы не вносите ошибок, потому что инструмент делает вещи, слегка отличающиеся от препроцессора C.
  • вам не нужно поддерживать какой-то пользовательский инструмент

Другие советы

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

<Ол>
  • Измените все #include на @include
  • Передать файл через препроцессор
  • Измените @include обратно на #include
  • Вместо того, чтобы изобретать велосипед, загрузите "unifdef". Если вы работаете с Linux, вы можете найти пакет для него, иначе он находится на FreshMeat

    Вы смотрели на Boost.Wave ?

    Препроцессор GCC обычно представляет собой отдельную программу, обычно называемую cpp . Это, вероятно, также лишит вас комментариев.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top