Есть ли лекарство от препроцессора блюза? - PullRequest
9 голосов
/ 11 апреля 2009

Я знаю, что могу выбросить препроцессор, чтобы выплевывать вывод с опцией -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 или другие, пожалуйста, дайте мне знать.

Ответы [ 6 ]

15 голосов
/ 11 апреля 2009

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

6 голосов
/ 11 апреля 2009

Для редактора Eclipse CDT работает довольно хорошо. Он показывает, какой код активен, а какой код # ifdef'ed, обеспечивает подсветку синтаксиса в коде, который # 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 - это удобный способ найти предопределенные макросы для вашей платформы.)

2 голосов
/ 11 апреля 2009

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

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

1 голос
/ 12 апреля 2009

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

1 голос
/ 11 апреля 2009

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

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

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

0 голосов
/ 19 января 2010

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

...