2009-04-11 10 views
9

So che posso dare un calcio al preprocessore per sputare l'output con l'opzione -E nella mia particolare circostanza. Per il codice generato questo output del preprocessore è micidiale. Ad esempio, ho un'applicazione 4gl e Informix lo converte in C che a sua volta viene sputato in un orribile pasticcio.Esiste una cura per il blues del preprocessore?

Quello che voglio è un editor che mi consentirà di specificare quali valori del preprocessore sono in vigore e mostrarmi solo il codice pertinente. Ho qualcosa di molto semplice in Vim che combacia con #ifdef e #endif, ma il codice è pieno di costrutti più avanzati come #ifndef, #if e #else. A peggiorare le cose, i costrutti sono logicamente più complessi, e non credo che le mie capacità di scripting di Vim siano adeguate per farmi ottenere ciò che voglio. Ad esempio:

#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 

Include la definizione di un valutatore di espressioni se voglio affrontarlo. Questo deve essere un problema risolto! Se hai suggerimenti Vim o altri, per favore fammi sapere.

+1

Eddie scuote come editor! – ojblass

+0

#ojblass Siamo entrambi parte dell'ordine segreto ... –

risposta

15

L'editor di Eclipse CDT esegue un ottimo lavoro evidenziando il codice in base ai macro dichiarati come attivi. Potresti volerlo controllare. alt text

+0

Bel tema linux! Come si chiama quello? – Kredns

+0

Sono in esecuzione su KDE (Kubuntu) – lothar

+0

Mi è piaciuto Kubuntu, ma ho dovuto disinstallarlo perché il mio PC fa schifo e ha solo 60 GB di spazio su disco fisso (non è molto importante quando contate Vista, 2 GB di musica, 3 IDE e molte altre schifezze che probabilmente dovrei disinstallare). – Kredns

6

Per un editor, Eclipse CDT funziona abbastanza bene. Mostra quale codice è attivo e quale codice è # ifdef'ed out, fornisce l'evidenziazione della sintassi all'interno del codice che è # ifdef'ed out in modo che tu possa ancora leggerlo facilmente, e che passi attraverso le espansioni macro una alla volta se tocchi su una macro.

Dalla riga di comando, cpp -dM filename.c elabora un file e mostra solo i #defini che sono in vigore. Ad esempio, nel codice, potrebbe sputare

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

senza ingombrare l'elenco con altre direttive del preprocessore o con C/codice C++.

(In una nota correlata, cpp -dM /dev/null è un modo pratico per trovare macro predefinite per la propria piattaforma.)

+1

+1 per la straordinaria sintassi della riga di comando! – Kredns

1

Se sei un utente Linux e si utilizza anche GNOME, allora avrei dovuto raccomandare GEdit. L'ho davvero apprezzato dopo aver installato alcuni plugins per Intellisense, la ricerca di file, ecc ... Se non stai usando GNOME ma stai ancora usando Linux (KDE) potresti essere in grado di usare Kate. Non ci ho giocato troppo a lungo, quindi non ho molto da dire al riguardo. GEdit funzionerà in KDE ma non funzionerà correttamente.

Se si utilizza Windows e si dispone di un PC veramente buono, provare Netbeans (sì, è anche per C++, non solo per Java). In caso contrario, c'è sempre Visual C++ 2008 (ancora abbastanza dipendente dalla RAM).

Non sono sicuro del Mac perché non posso permettermelo, ma anche Netbeans funziona (oltre a Linux).

2

Considera di guardare "Figlio di Unifdef", citato nella risposta allo Is there a C pre-processor which eliminates #ifdef blocks based on values defined/undefined?. Questo non è un editor visivo, ma prenderebbe il codice C (o il codice con le direttive del preprocessore C in esso) e genererà un file modificato che potreste quindi confrontare con l'originale.

Sono curioso di parlare di Informix 4GL (I4GL). Il codice C che genera non è, AFAIK, allacciato con i costrutti #ifdef.Almeno, all'output non era permesso di contenere alcunché quando ero a capo di esso. (Quale versione di I4GL stai usando?) Ci sono molte voci #line; quelli ti permettono di inseguire il codice generato fino alla sorgente I4GL corrispondente. Ho uno script che converte quelli in semplici commenti C in modo che io possa usare un debugger (gdb o dbx o ... perire il pensiero, sdb o adb) sul codice compilato. E ho anche visto i preprocessori (sia cpp e m4) utilizzati per generare il codice sorgente I4GL per l'invio al compilatore I4GL.

+0

Utilizziamo la versione versione 2.95 e la versione 3.5 del client SDK informix; tuttavia, è altamente personalizzato per il nostro ambiente. – ojblass

+0

Il codice preelaborato non è attraente per molti altri motivi (anche con i numeri di riga). Guardare il mio piccolo universo di codice è molto più facile da digerire. A mano a mano che guardo più da vicino, tutto sembra provenire dai nostri stessi file di intestazione crappy. – ojblass

+0

Alcuni di essi abilitano o disabilitano le funzionalità a seconda delle versioni del compilatore poiché dobbiamo supportare un ambiente non uniforme (qui il motore Informix 7, il motore Informix 9 qui, il motore Informix 10 lì. Per favore uccidimi. – ojblass

1

Emacs ha nascondere-ifdef-mode (non ho mai dovuto usare io stesso, quindi non posso garantire per la sua qualità)

0

Potete anche provare unifdef che è piuttosto semplice rispetto sunifdef.

Problemi correlati