Разбор операторов препроцессора C ++ #if - PullRequest
4 голосов
/ 13 ноября 2008

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

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

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

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

Ответы [ 5 ]

14 голосов
/ 13 ноября 2008

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

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

  • Вашим клиентам не нужно беспокоиться о -D вариантах
  • вам не нужно выполнять какой-либо пользовательский шаг в процессе сборки
  • код, который вы даете своим клиентам, не может быть частично запутан
  • вы не вносите ошибок, потому что инструмент немного отличается от препроцессора C
  • вам не нужно поддерживать какой-то пользовательский инструмент
12 голосов
/ 13 ноября 2008

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

  1. Измените все #include на @ include
  2. Передача файла через препроцессор
  3. Измените @include обратно на # include
8 голосов
/ 13 ноября 2008

Вместо того, чтобы изобретать велосипед, скачайте "unifdef". Если вы работаете с Linux, вы можете найти пакет для него, в противном случае он будет FreshMeat

4 голосов
/ 13 ноября 2008

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

0 голосов
/ 13 ноября 2008

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

...