2008-11-13 4 views
4

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

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

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

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

ответ

14

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

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

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

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

8

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

+0

Насколько я могу судить, это поддерживает только подмножество синтаксиса #if. (Довольно большое подмножество, но я надеялся на полную поддержку, чтобы избежать риска будущих «ошибок», потому что инструмент делает вещи по-разному », - сказал Майк) – user9876 2008-11-28 15:02:36

12

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

  1. Изменить все #include для @include
  2. Пасс файл через препроцессор
  3. Изменить @include назад #include
+0

Это также убивает комментарии и расширяет все # define. – MSalters 2008-11-14 12:55:41

+0

В него также входят заголовки. – 2008-11-15 22:59:50