Есть ли лекарство от синевы препроцессора?

Я знаю, что могу запустить препроцессор, чтобы он выдал результат с параметром -E в моих конкретных обстоятельствах. Для сгенерированного кода этот вывод препроцессора убийственен. Например, у меня есть приложение 4gl, и Informix преобразует его в C, который, в свою очередь, превращается в ужасный уродливый беспорядок.

Мне нужен редактор, который позволит мне указать, какие значения препроцессора действуют, и показать мне только соответствующий код. У меня есть кое-что очень простое, работающее в Vim, сопоставляющее #ifdef и #endif, но код пронизан более сложными конструкциями, такими как #ifndef, #if и #else. Что еще хуже, конструкции логически более сложны, и я не думаю, что мои навыки написания сценариев Vim достаточны для того, чтобы получить от них то, что я хочу. Например:

#if DLEVEL > 5
    #define SIGNAL  1
    #if STACKUSE == 1
        #define STACK   200
    #else
        #define STACK   100
    #endif
#else
    #define SIGNAL  0
    #if STACKUSE == 1
        #define STACK   100
    #else
        #define STACK   50
    #endif
#endif
#if DLEVEL == 0
    #define STACK 0
#elif DLEVEL == 1
    #define STACK 100
#elif DLEVEL > 5
    display( debugptr );
#else
    #define STACK 200
#endif

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


person ojblass    schedule 11.04.2009    source источник
comment
#ojblass Мы оба являемся участниками секретного ордена ...   -  person Mateen Ulhaq    schedule 26.04.2011


Ответы (6)


Редактор Eclipse CDT неплохо справляется с выделением кода на основе макросов, которые вы объявляете активными. Вы можете проверить это. alt text

person lothar    schedule 11.04.2009
comment
Хорошая тема для Linux! Как это называется? - person Kredns; 11.04.2009
comment
Мне понравился Kubuntu, но мне пришлось удалить его, потому что мой компьютер отстой и имеет только 60 ГБ места на жестком диске (это не много, если вы считаете Vista, 2 ГБ музыки, 3 IDE и много другого дерьма, которое я, вероятно, должен удалить). - person Kredns; 11.04.2009
comment
@Aardvark Я знаю, что это не по теме, но как насчет установки на внешний HD? - person lothar; 11.04.2009
comment
@lothar: у меня его нет. Я действительно собирался купить его, но у меня нет денег (я все еще учусь в старшей школе, что объясняет отстойный компьютер). Когда я смогу, я планирую купить один (ну, и Mac ;-). - person Kredns; 11.04.2009
comment
Я бы выбрал этот, но я не хочу, чтобы он выделял код, а удалял мертвый код. - person ojblass; 11.04.2009
comment
+1 на CDT. Вы можете открыть свой код, навести курсор на макрос, и появится всплывающее окно с реальным определением макроса с вашими определенными токенами препроцессора (точно так же, как если бы препроцессор был запущен только для этого макроса). - person David Rodríguez - dribeas; 11.04.2009
comment
@ojblass Что вы имеете в виду под удалением? Просто не замечаешь? CDT позволяет сворачивать неактивный код (сворачивается на 1 строку). Если вы хотите реального удаления, то лучшим вариантом будет использование препроцессора C. - person lothar; 11.04.2009

Для редактора неплохо работает Eclipse CDT. Он показывает, какой код активен, а какой код # ifdef'ed out, он обеспечивает выделение синтаксиса внутри кода, который # ifdef'ed, чтобы вы все еще могли его легко прочитать, и он может шагать по расширению макроса по одному, если вы наводите указатель мыши над макросом.

В командной строке cpp -dM filename.c обрабатывает файл и показывает только действующие #defines. Например, в вашем коде он может выплюнуть

#define DLEVEL 5
#define SIGNAL 1
#define STACK 200
#define STACKUSE 1

не загромождая листинг другими директивами препроцессора или кодом C / C ++.

(Кстати, cpp -dM /dev/null - удобный способ найти предопределенные макросы для вашей платформы.)

person Josh Kelley    schedule 11.04.2009

Рассмотрите возможность просмотра «Сына Unifdef», процитированного в ответе на Есть ли препроцессор C, который удаляет блоки #ifdef на основе определенных / неопределенных значений?. Это не визуальный редактор - он, однако, берет код C (или код с директивами препроцессора C в нем) и генерирует измененный файл, который затем можно сравнить с оригиналом.

Мне любопытно упоминание об Informix 4GL (I4GL). Код C, который он генерирует, AFAIK не пронизан конструкциями #ifdef. По крайней мере, когда я отвечал за это, в выходных данных ничего не могло быть. (Какую версию I4GL вы используете?) Есть много #line записей; они позволяют вам преследовать сгенерированный код обратно к соответствующему источнику I4GL. У меня есть сценарий, который преобразует их в простые комментарии C, чтобы я мог использовать отладчик (gdb или dbx или ... убей мысль, sdb или adb) в скомпилированном коде. И я также видел препроцессоры (как cpp, так и m4), используемые для генерации исходного кода I4GL для отправки компилятору I4GL.

person Jonathan Leffler    schedule 11.04.2009
comment
Мы используем версию 2.95 и версию 3.5 клиентского SDK informix; однако он сильно адаптирован к нашей среде. - person ojblass; 11.04.2009
comment
Предварительно обработанный код непривлекателен по многим другим причинам (даже с номерами строк). Глядя на мою небольшую вселенную кода, гораздо легче переварить. Если присмотреться, кажется, что все это взято из наших дрянных заголовочных файлов. - person ojblass; 11.04.2009
comment
Некоторые из них включают или отключают функции в зависимости от версий компилятора, поскольку мы должны поддерживать неоднородную среду (здесь ядро ​​Informix 7, здесь ядро ​​Informix 9, там ядро ​​Informix 10. Пожалуйста, убейте меня. - person ojblass; 11.04.2009
comment
Хорошая новость заключается в том, что вы должны поощрять всех отказаться от IDS 7.31 и IDS 9.40, так как обе из них скоро прекратят поддержку со стороны IBM (9.40 в апреле, 7.31 в сентябре). CSDK 3.50 является текущим; Не думаю, что было 2,95, но это не имеет большого значения. Все они довольно похожи. - person Jonathan Leffler; 11.04.2009
comment
И я согласен с тем, что то, что я вижу, больше похоже на код из ваших заголовков, чем на материал из I4GL как таковой. Сгенерированный I4GL код C - как и большинство сгенерированных кодов - на самом деле не предназначен для человеческого потребления, только для компиляторов. - person Jonathan Leffler; 11.04.2009

Если вы пользователь Linux и также используете GNOME, мне бы порекомендовать GEdit. Мне он очень понравился после того, как я установил несколько подключаемых модулей для Intellisense, просмотра файлов и т. Д ... Если вы не используете GNOME, но все еще используете Linux (KDE), вы можете использовать Kate. Я не играл с ним слишком долго, поэтому мне нечего сказать по этому поводу. GEdit будет работать в KDE, но будет выглядеть неправильно.

Если вы используете Windows и у вас действительно хороший компьютер, попробуйте Netbeans (да, это тоже для C ++, а не просто Ява). Если нет, всегда есть Visual C ++ 2008 (хотя все еще довольно сильно зависит от ОЗУ).

Я не уверен насчет Mac, так как не могу себе этого позволить, но Netbeans также работает на нем (как и Linux).

person Kredns    schedule 11.04.2009

В Emacs есть hide-ifdef-mode (мне никогда не приходилось использовать его самому, поэтому я не могу поручиться за его качество)

person Community    schedule 12.04.2009

Вы также можете попробовать unifdef, который проще, чем sunifdef.

person Tony Finch    schedule 18.01.2010