2013-03-31 15 views
6

Esistono strumenti per trasformare il codice sorgente in C++ nel codice sorgente in C/C++, ma con modelli istanziati (srotolati)? Ciò è necessario per una comprensione non ambigua, nel codice che convertono i modelli di codice C++. Può essere presente negli IDE (MSVS, QtCreator, ...) o nei compilatori (ICC, GCC, MSVC, Clang)?Esistono strumenti per trasformare il codice sorgente in C++ nel codice sorgente in C/C++, ma con modelli istanziati (srotolati)?

+0

mi ricordo di una tempo in cui ho finito per compilare codice C++ pesantemente basato su modelli in assem perché il numero di classi, modelli e file era irragionevolmente alto per tuffarsi dentro per scoprire quello di cui avevo bisogno. Certo, questo non funzionerà in ogni caso. –

+0

@Alexey Frunze Quindi, posso vedere solo il codice assembly, ma non C/C++ - codice dopo l'istanziazione dei template, è vero? – Alex

+0

Sì e no. Se sei interessato a scoprire cosa fa esattamente il codice dietro a tutti questi strati di astrazioni, lo farai. E vedrai quali funzioni vengono chiamate e quali tipi vengono utilizzati. Quindi, anche se alcune informazioni presenti nel codice sorgente vengono perse, si può ancora vedere molto. Potresti essere interessato a abilitare e disabilitare l'ottimizzazione del codice, però. Con l'ottimizzazione troppo pesante potresti avere molte funzioni inline e quindi la struttura del codice non sarà così evidente. –

risposta

4

questo sembra giá risposto su SO

L'Idea/principio da Alexey Frunze a usare il codice smontato è abbastanza buono, insieme con l'uso di modelli semplificati c'è una buona possibilità di capire esattamente cosa fa.

Modifica 1 Ci sono poche altre possibilità come ottenere una comprensione delle cose che il compilatore aveva fatto

  1. Usa: gcc -S -O1 {yourcode.cpp} per ottenere il montaggio e utilizzare lo strumento c++filt (la sua parte di binutils per convertire il disassemblaggio a C-codice se si sente più confortevole con C-code
  2. Usa: g++ -fdump-tree-original file.cpp per ottenere un po 'di (pseudo) codice C++
  3. Utilizzare il MSVC++ debugger w on il punto di interruzione dopo l'ultima instatiation e vedere tutti i tipi e valori che sono i parametri del modello instatiated
  4. Usa: GCC XML per la generazione di XML con i modelli istanziati (FAQ)
  5. sapere come il compilatore instatiated e ottimizzato i modelli che si può usare Clang: -emit-llvm per ottenere la LLVM IR, e utilizzare llvm-dis per convertirlo in testo
  6. Comeau C++ in grado di "compilazione" C++ per il codice C, ma ora il compilatore non è più mantenuto
1

È possibile aggirare il problema posizionando un errore intenzionale all'interno dell'istanza o dei suoi parametri, quindi il compilatore (supponendo versioni decenti: gcc 4.8, clang, ecc.) Restituisce qualcosa sulla falsariga di: "errore con template XXX istanziato con A = int, B = float, .. ".