5

W szczególności używając g ++ na Linuksie, czy istnieje sposób na określenie, która z funkcji przeciążenia lub szablonu została wybrana dla konkretnej instrukcji?czy kompilator może mi powiedzieć, która funkcja jest przeładowana lub wybrana?

Mówiąc dokładniej, nie zakładam, że koniecznie znam wszystkie możliwe opcje, które mogą znajdować się w plikach nagłówkowych pochodzących z różnych bibliotek. I nawet jeśli tak, nie zakładam, że mogę zmodyfikować odpowiedni kod.

+0

http://stackoverflow.com/questions/1496497/how-can-i-see-parse-tree-intermediate-code-optimization-code-and-assembly-code mogą być przydatne - np. spójrz na kroki pośredniego kompilatora. Gdyby chcesz to zrobić tylko jeden raz, możesz spojrzeć na wygenerowane pliki obiektów i być może przykleić "znacznik" wywołania funkcji otaczającego połączenie, które chcesz zrozumieć. Plik obiektowy wskaże nazwę symbolu wywoływanej funkcji, którą można ponownie przywrócić do podpisu funkcji (który powinien być unikalny), który wywołałeś. – Yakk

+5

Często mówiłem, że potrzebujemy debugowania w czasie kompilacji, aby można było przejść przez instancje szablonów podczas ich oceny, analizowania argumentów szablonu itp., Aby zobaczyć, co się naprawdę dzieje. –

+0

Kiedy mówisz * widzisz *, co dokładnie masz na myśli? Clang jest znany z tworzenia w pełni uformowanego AST dla C++, jednak trzeba napisać program dookoła swoich bibliotek, aby móc "widzieć". –

Odpowiedz

1

Nie wiem, jak to zrobić bezpośrednio.

Najprostszym rozwiązaniem jest ustawienie punktu przerwania w miejscu połączenia i jednoetapowe na dowolną funkcję; twój debugger może wtedy powiedzieć, którą funkcję używasz.

IDE, takie jak Eclipse CDT, może sam dokonać przeciążenia i rozdzielczości szablonów (jeśli wszystko działa poprawnie), więc kliknięcie prawym przyciskiem myszy wywołania funkcji i przejście do deklaracji funkcji spowoduje zabrać cię do odpowiedniej funkcji.

Przez celowe tworzenie niejednoznacznych wywołań funkcji, jak opisano w this answer, można uzyskać listę wszystkich dostępnych przeciążeń i szablonów i prawdopodobnie dowiedzieć się, z którego z nich jest wywoływany.

Jak powiedział Matthieu M., Clang może dump its AST. To wymaga pewnej interpretacji, ale może pomóc ci ustalić, która funkcja jest wywoływana.

+0

Dzięki. Jeśli Eclipse naprawdę może to zrobić, jestem pod wrażeniem i to byłoby dobre rozwiązanie. –

+0

@ c-urchin - Uniemożliwienie Eclipse rozpoznawania różnych plików źródłowych i nagłówkowych może być trudne, a szczególnie skomplikowany kod C++ rzadko może go mylić, ale po uruchomieniu działa bardzo przyjemnie. –

+0

@ c-urchin - MS VS też może to zrobić. Przesuń kursor myszy na nazwę funkcji i zobaczysz nazwę funkcji przeciążania wywoływania oraz liczbę funkcji przeciążenia. Myślę, że każdy współczesny IDE musi to zrobić. – SergV

1

Częściowa odpowiedź.

można wykorzystywać niestandardowe makra do drukowania nazwy funkcji w czasie wykonywania (Macro/keyword which can be used to print out method name?

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); 
} 

Wyjście z tego kodu (http://ideone.com/PI39qK):

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

Dzięki, ale jak już powiedziałem, nie mogę założyć, że mogę zmodyfikować kod źródłowy lub że nawet wiem, jaki kod może być kandydatem, ponieważ może on pochodzić z dowolnego pliku # include'd (na dowolnym poziomie) –

Powiązane problemy