Есть ли лекарство от блюза препроцессора?

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

мне нужен редактор, который позволит мне указать, какие значения препроцессора действуют, и показать мне только соответствующий код. У меня что-то очень простая работа в Vim matching #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 ответов


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


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

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

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

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

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


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

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


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

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

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


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


вы также можете попробовать unifdef что гораздо проще, чем sunifdef.