2009-04-11 10 views
9

Sé que puedo patear el preprocesador para escupir la salida con la opción -E en mi circunstancia particular. Para el código generado, esta salida del preprocesador es asesina. Por ejemplo, tengo una aplicación de 4gl e Informix convierte esto en C que a su vez se escupió a un lío feo y horrible.¿Hay alguna cura para el blues del preprocesador?

Lo que quiero es un editor que me permita especificar qué valores de preprocesador están en efecto y mostrarme solo el código correspondiente. Tengo algo muy básico que funciona en Vim que coincide con #ifdef y #endif, pero el código está plagado de construcciones más avanzadas como #ifndef, #if y #else. Para empeorar las cosas, los constructos son lógicamente más complejos, y no creo que mis habilidades de scripting de Vim sean adecuadas para obtener lo que quiero de él. Por ejemplo:

#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 

Incluye la definición de un evaluador de expresiones si quiero abordarlo. ¡Esto tiene que ser un problema resuelto! Si tienes sugerencias de Vim u otras, por favor avísame.

+1

Eddie rockea como editor! – ojblass

+0

#ojblass Ambos somos parte de la orden secreta ... –

Respuesta

15

El editor Eclipse CDT hace un buen trabajo destacando el código basado en las macros que declara estar activo. Es posible que desee comprobarlo. alt text

+0

¡Bonito tema de Linux! ¿Cómo se llama eso? – Kredns

+0

Me estoy ejecutando en KDE (Kubuntu) – lothar

+0

Me gustó Kubuntu, pero tuve que desinstalarlo porque mi PC apesta y solo tiene 60 GB de espacio en el disco duro (eso no es mucho cuando se cuenta Vista, 2 GB de música, 3 IDE y mucha otra basura probablemente debería desinstalar). – Kredns

6

Para un editor, Eclipse CDT funciona bastante bien. Muestra qué código está activo y qué código es # ifdef'ed out, proporciona resaltado de sintaxis dentro del código que es # ifdef'ed out para que pueda leerlo fácilmente, y puede avanzar a través de las macroexpansiones de a una por vez si el mouse sobre una macro.

Desde la línea de comandos, cpp -dM filename.c procesa un archivo y muestra solo las # definiciones que están en vigencia. Por ejemplo, en el código, podría escupir

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

sin estorbar la lista con otras directivas del preprocesador o con/C código C++.

(En una nota relacionada, cpp -dM /dev/null es una forma práctica para encontrar las macros predefinidas para su plataforma.)

+1

+1 para la impresionante sintaxis de línea de comandos! – Kredns

1

Si usted es un usuario de Linux y también utilizar GNOME entonces yo tendría que recomendar GEdit. Realmente me encantó después de instalar algunos plugins para Intellisense, búsqueda de archivos, etc ... Si no está ejecutando GNOME pero todavía está usando Linux (KDE), es posible que pueda usar Kate. No jugué con eso por mucho tiempo, así que no tengo mucho que decir al respecto. GEdit funcionará en KDE pero no se verá bien.

Si está usando Windows y tiene una PC realmente buena, intente con Netbeans (sí, también es para C++, no solo para Java). Si no, siempre hay Visual C++ 2008 (aunque todavía bastante dependiente de la RAM).

No estoy seguro acerca de Mac, ya que no puedo pagar uno, pero Netbeans también funciona (así como Linux).

2

Considere la posibilidad de mirar "Hijo de Unifdef", citado en la respuesta a Is there a C pre-processor which eliminates #ifdef blocks based on values defined/undefined?. Este no es un editor visual; sin embargo, tomaría el código C (o el código con las directivas del preprocesador C) y generaría un archivo modificado que luego podría comparar con el original.

Tengo curiosidad acerca de la mención de Informix 4GL (I4GL). El código C que genera no es, AFAIK, enlazado con construcciones #ifdef.Al menos, la salida no podía contener ninguna cuando yo estaba a cargo de eso. (¿Qué versión de I4GL estás usando?) Hay muchas entradas #line; ésos le permiten perseguir el código generado de nuevo a la fuente I4GL correspondiente. Tengo un script que los convierte en simples comentarios C para que pueda usar un depurador (gdb o dbx o ... perecer el pensamiento, sdb o adb) en el código compilado. Y también he visto preprocesadores (ambos cpp y m4) utilizados para generar el código fuente I4GL para el envío al compilador I4GL.

+0

Estamos utilizando la versión 2.95 y la versión 3.5 del SDK del cliente informix; sin embargo, es altamente personalizado para nuestro entorno. – ojblass

+0

El código preprocesado no es atractivo por muchas otras razones (incluso con los números de línea). Mirar mi pequeño universo de código es mucho más fácil de digerir. Cuando miro más de cerca todo parece provenir de nuestros propios archivos de cabecera. – ojblass

+0

Algunos de ellos habilitan o deshabilitan características dependiendo de las versiones del compilador, ya que tenemos que admitir un entorno no uniforme (el motor de Informix 7 aquí, el motor de Informix 9 aquí, el motor de Informix 10 allí. Por favor, mátame. – ojblass

1

Emacs tiene ocultar-ifdef-mode (nunca he tenido que usar yo mismo, así que no puedo dar fe de su calidad)

0

También puede intentar unifdef que es bastante más simple que sunifdef.

Cuestiones relacionadas