Синтаксический анализ инструкций препроцессора C ++ #if
-
08-07-2019 - |
Вопрос
У меня есть исходный файл на C / C ++ с условной компиляцией.Прежде чем я отправлю его клиентам, я хочу удалить большую часть операторов #if, чтобы моим клиентам не нужно было беспокоиться о передаче правильных параметров компилятору.
У меня это реализовано и работает на Python, но он правильно обрабатывает только операторы #ifdef и #ifndef .Мне нужно добавить поддержку операторов #if, но синтаксис #if намного сложнее.(Например.вы можете использовать &&, ||, !, скобки, операторы отношения, арифметику и т.д.).
Существует ли какой-либо существующий код с открытым исходным кодом для анализа и оценки операторов #if?(Желательно на Python).
Единственная известная мне реализация - это GCC, и она слишком сложна для этой задачи.
Решение
Как Кейтб сказал, вы могли бы просто позволить препроцессору сделать это за вас.
Но если вы не пытаетесь что-то скрыть (т. Е. в условно скомпилированном коде могут быть вещи, которые вы не хотите или которым не разрешено передавать кому-либо еще), гораздо более простым вариантом было бы просто поместить правильное #define
директивы в заголовке, включенном глобально.
- вашим клиентам не нужно беспокоиться о
-D
Опции - вам не обязательно выполнять какой-то пользовательский этап в процессе сборки
- код, который вы предоставляете своим клиентам, потенциально не является наполовину запутанным
- вы не вносите ошибок, потому что инструмент делает вещи, слегка отличающиеся от препроцессора C.
- вам не нужно поддерживать какой-то пользовательский инструмент
Другие советы
Как насчет того, чтобы просто пройти через препроцессор C и позволить этому делать свою работу. Это избавит их от всех, поэтому вам может понадобиться шаг перед препроцессором и шаг после препроцессора, чтобы защитить вещи, которые вы не хотите расширять.
<Ол>Вместо того, чтобы изобретать велосипед, загрузите "unifdef". Если вы работаете с Linux, вы можете найти пакет для него, иначе он находится на FreshMeat р>
Вы смотрели на Boost.Wave ?
Препроцессор GCC обычно представляет собой отдельную программу, обычно называемую cpp
. Это, вероятно, также лишит вас комментариев.