2015-03-08 15 views
7

Come testare/espandere tutte le macro di funzione, in un file C/C++, senza eseguirlo attraverso un preprocessore? Per esempio, c'è un programma o un metodo che avrebbe cambiato questo:Espandi macro di funzioni C/C++ senza preprocessore

#include <iostream> 
#define AAA(a) cout << "function " << a << endl 
using namespace std; 
int main(){ 
AAA(12); 
} 

in tutto questo?

#include <iostream> 
using namespace std; 
int main(){ 
cout << "function " << 12 << endl; 
} 

Non voglio correre attraverso preprocessore perché tutta la include nei file di fare il "gcc -E <>" uscita veramente brutto, voglio solo un paio di semplici espansioni di macro senza tutto l'overhead.

+3

Probabilmente potresti scrivere del codice che usa clang come libreria e usarlo come preprocessore. A meno che grep -v^\ # includa myfile | gcc -E' sia abbastanza buono per te. –

+0

Resharper per C++ ti consente di farlo. – chris

+0

Grazie per il suggerimento Mats, guarderò in Clang. Tuttavia, itererà oltre 33k + linee di codice, quindi penso che il grep risulterebbe un po 'sporco. Sono su un mac adesso ma salterò su una VM e dare un colpo anche a Resharper. – Involution

risposta

-1

Supponiamo di voler vedere file.c. Se contiene la funzione main, è necessario modificare il nome di tale funzione affinché funzioni. Quanto segue stampa il file sullo stdout, solo con una moderata bruttezza aggiunta.

#include "file.c" 
#include <stdio.h> 

#define X(...) #__VA_ARGS__ 

void print_file(char* s) 
{ 
    // a loop here to move through s until some identifier is found 
    // in the original file, say a comment that says: //___START___HERE___ 
    while(*s){ 
     if(*s=='{' | *s=='}' | *s=='#') printf("\n"); 
     printf("%c",*s); 
     if(*s==';') printf("\n"); 
     } 
} 

int main(int argc, char* argv[]) 
{ 
    print_file(X(
    #include "file.c" 
    )); 
    return 0; 
} 
+0

Questo stamperà tutto incluso nel file. – Puppy

+0

@Puppy, questo è un problema davvero secondario. Semplicemente non stampare finché non trovi il nome principale modificato, o qualche commento impostato, o qualcosa del genere. Questo è come 2 righe di codice extra. – Kyle

+0

L'analisi corretta del codice C++ è tutt'altro che banale. – Puppy

2

No, non è possibile. Le intestazioni incluse potrebbero includere macro che si desidera espandere nel corpo, ad esempio. O intendevi non espandere alcun macro proveniente dalle intestazioni? Il preprocessore non ha assolutamente alcun modo di distinguere ciò che vuoi da ciò che non vuoi in questo caso.

Se si sa in anticipo questo non è il caso, quindi mi raccomando semplicemente di scrivere uno script per rimuovere gli include e quindi eseguirlo attraverso il preprocessore.

1

ho sentito tutte le possibili risposte negative sul tema:

  • macro possono essere ampliate solo non è valutata
  • processore dovrebbe analizzare anche i file include
  • macro nidificate possono essere troppo complicato
  • condizionale la preelaborazione può essere ingannevole
  • i macro sono malvagi evitali semplicemente
  • ecc. ecc.

Sono tutti veri, ma IMO si scontrano con la realtà della programmazione di tutti i giorni.

In effetti, lavorare su un vecchio progetto C in cui le macro venivano utilizzate per lo più semplicemente come funzioni, è diventato per me di fondamentale importanza. La generazione di tutti i file preelaborati con/P funziona ma è eccessivo e richiede tempo. Avevo solo bisogno di uno strumento che espanda una semplice macro definita con poche righe sopra o al massimo in altri file.

Come fare?

1 Onl, inux sufficiente utilizzare GDB e le sue espandere le capacità macro 2 Su Windows che uso https://www.jetbrains.com/resharper-cpp/ integrato in Visual Studio

Quindi, sì, in un certo senso pratico, è possibile.

Problemi correlati