5

Gibt es unter Verwendung von g ++ unter Linux eine Möglichkeit zu bestimmen, welche überladene oder Template-Funktion für eine bestimmte Anweisung ausgewählt wurde?kann der Compiler mir mitteilen, welche Überladungs- oder Template-Funktion er gewählt hat?

Genauer gesagt, ich gehe nicht davon aus, dass ich unbedingt alle möglichen Entscheidungen kenne, die in Header-Dateien aus verschiedenen Bibliotheken sein können. Und selbst wenn, würde ich nicht davon ausgehen, dass ich den entsprechenden Code ändern könnte.

+0

http://stackoverflow.com/questions/1496497/how-can-i-see-parse-tree-intermediate-code-optimization-code-and-assembly-code könnte nützlich sein - dh, schau dir die Zwischenschritte des Compilers an. Ob Sie möchten das nur einmal tun, Sie könnten sich die generierten Objektdateien ansehen und vielleicht einen "Marker" -Funktionsaufruf um den Anruf herumlegen, den Sie verstehen wollen. Die Objektdatei zeigt an, wie der Symbolname der aufgerufenen Funktion lautet, die in die von Ihnen aufgerufene Funktionssignatur (die eindeutig sein sollte) vermerkt ist. – Yakk

+5

Ich habe oft gesagt, dass wir einen Kompilierzeit-Debugger brauchen, damit Sie Template-Instanziierungen während der Auswertung durchgehen können, indem Sie sich Template-Argumente anschauen, um zu sehen, was wirklich vor sich geht. –

+0

Wenn Sie sagen * sehen *, was meinst du genau? Clang ist berüchtigt dafür, eine voll ausgebildete AST für C++ zu erstellen, aber Sie müssten ein Programm um seine Bibliotheken schreiben, um "sehen" zu können. –

Antwort

1

Ich kenne keine Möglichkeit, dies direkt zu tun.

Die einfachste Lösung besteht darin, einen Haltepunkt an der Aufrufstelle und Einzelschritt in die Funktion zu setzen, die aufgerufen wird; Ihr Debugger kann Ihnen dann sagen, in welcher Funktion Sie sind.

Eine IDE wie Eclipse CDT kann Überladung und Template-Auflösung selbst tun (wenn alles richtig funktioniert), also mit der rechten Maustaste auf einen Funktionsaufruf klicken und zur Funktionsdeklaration gehen bringen Sie zur entsprechenden Funktion.

Indem Sie absichtlich einen mehrdeutigen Funktionsaufruf erstellen, wie in this answer beschrieben, können Sie eine Liste aller verfügbaren Überladungen und Vorlagen erhalten und wahrscheinlich herausfinden, welche von dort aufgerufen wird.

Wie Matthieu M. sagte, kann Clang dump its AST. Dies erfordert einige Interpretationen, aber es kann Ihnen helfen, herauszufinden, welche Funktion aufgerufen wird.

+0

Danke. Wenn Eclipse das wirklich kann, bin ich beeindruckt und das wäre eine schöne Lösung. –

+0

@ c-urchin - Es kann schwierig sein, Eclipse die verschiedenen Quell- und Header-Dateien korrekt zu erkennen, und besonders komplexer C++ - Code kann es nur selten verwirren, aber es ist sehr schön, wenn es einmal funktioniert. –

+0

@ c-urchin - MS VS kann es auch tun. Bewegen Sie den Mauszeiger auf den Namen der Funktion und Sie können den Namen der aufrufenden Überlastfunktion und die Anzahl der Überlastungsfunktionen sehen. Ich denke, jede moderne IDE muss es tun. – SergV

1

Teilweise Antwort.

können Sie Nicht-Standard-Makro zum Drucken Name der Funktion in der Laufzeit (Macro/keyword which can be used to print out method name?

für 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); 
} 

Ausgabe von diesem Code (http://ideone.com/PI39qK):

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

Danke, aber wie gesagt, ich kann nicht davon ausgehen, dass ich den Quellcode modifizieren kann oder dass ich sogar weiß, welcher Code ein Kandidat sein könnte, da er aus jeder # include'd-Datei (auf jeder Ebene) stammen könnte. –