5

Specificamente utilizzando g ++ su linux, esiste un modo per determinare quale funzione di overload o modello è stata scelta per una particolare istruzione?il compilatore può dirmi quale funzione di sovraccarico o modello ha scelto?

In particolare, non presumo che io conosca necessariamente tutte le possibili scelte, che possono essere nei file di intestazione provenienti da varie librerie. E anche se l'avessi fatto, non presumo che avrei potuto modificare il codice pertinente.

+0

http://stackoverflow.com/questions/1496497/how-can-i-see-parse-tree-intermediate-code-optimization-code-and-assembly-code potrebbe essere utile - per esempio, guarda i passaggi intermedi del compilatore. Se vuoi farlo una sola volta, puoi guardare i file oggetto generati e magari attaccare una chiamata alla funzione "marker" che circonda la chiamata che vuoi capire. Il file oggetto indicherà quale sia il nome simbolico della funzione chiamata, che può essere revered nella firma della funzione (che dovrebbe essere unica) che hai chiamato. – Yakk

+5

Ho spesso detto che ciò di cui abbiamo bisogno è un debugger in fase di compilazione, in modo che tu possa passare attraverso le istanze dei template mentre vengono valutati, osservando gli argomenti del template, ecc., Per vedere cosa sta realmente accadendo. –

+0

Quando dici * vedi *, cosa intendi esattamente? Clang è noto per la produzione di un AST completamente formato per C++, tuttavia è necessario scrivere un programma attorno alle sue librerie per poter "vedere". –

risposta

1

Non conosco un modo per farlo direttamente.

La soluzione più semplice è impostare un punto di interruzione nel sito di chiamata e un singolo passaggio in qualsiasi funzione venga chiamata; il tuo debugger può quindi dirti in quale funzione ti trovi.

Un IDE come Eclipse CDT può eseguire da solo l'overload e la risoluzione del modello (se tutto funziona correttamente), quindi fare clic con il pulsante destro del mouse su una chiamata di funzione e andare alla dichiarazione della funzione. portarti alla funzione appropriata.

Creando deliberatamente una chiamata di funzione ambigua, come descritto in this answer, è possibile ottenere un elenco di tutti i sovraccarichi e modelli disponibili e può probabilmente capire quale viene richiamato da lì.

Come ha detto Matthieu M., Clang può dump its AST. Ciò richiede qualche interpretazione, ma può aiutarti a capire quale funzione viene chiamata.

+0

Grazie. Se Eclipse può davvero farlo, sono impressionato e sarebbe una buona soluzione. –

+0

@ c-riccio - Ottenere Eclipse per riconoscere correttamente i vari file di origine e di intestazione può essere complicato, e il codice C++ particolarmente complesso può raramente confonderlo, ma è molto bello una volta che funziona. –

+0

@ c-riccio - MS VS può farlo anche. Spostare il cursore del mouse sul nome della funzione e visualizzare il nome della funzione di sovraccarico della chiamata e il numero di funzioni di sovraccarico. Penso che qualsiasi IDE moderno debba farlo. – SergV

1

Risposta parziale.

È possibile utilizzare macro non standard per la stampa nome della funzione in fase di esecuzione (Macro/keyword which can be used to print out method name?

per GNU C++:

#include <iostream> 
using namespace std; 
template <typename T> 
void f(const T & t) 
{ 
    cout << __PRETTY_FUNCTION__ << endl; 
} 
void f(const string &) 
{ 
    cout << __PRETTY_FUNCTION__ << endl; 
} 
void f(int) 
{ 
    cout << __PRETTY_FUNCTION__ << endl; 
} 
int main() 
{ 
    f(1.0); 
    f(1); 
    f(string("sss")); 
    string a; 
    f(a); 
} 

uscita da questo codice (http://ideone.com/PI39qK):

void f(int) 
void f(int) 
void f(const std::string&) 
void f(T&) [with T = std::string] 
+0

Grazie, ma come ho detto non posso dare per scontato che io possa modificare il codice sorgente o che io sappia anche quale codice potrebbe essere un candidato poiché potrebbe provenire da qualsiasi file # include'd (a qualsiasi livello) –

Problemi correlati