2010-10-07 9 views
9

Obecnie próbuję debugować fragment prostego kodu i chcę zobaczyć, jak zmienia się konkretny typ zmiennej podczas programu.daneinfo/typid output

Używam pliku nagłówka typeinfo, więc mogę użyć typeid.name(). Jestem świadomy, że typeid.name() jest specyficzne dla kompilatora, więc dane wyjściowe mogą nie być szczególnie pomocne lub standardowe.

Używam GCC, ale nie mogę znaleźć listy potencjalnych wyników mimo wyszukiwania, zakładając, że istnieje lista symboli wyjściowych typu. Nie chcę wykonywać żadnego castingu na podstawie danych wyjściowych ani manipulować jakimikolwiek danymi, wystarczy śledzić jego typ.

#include <iostream> 
#include <typeinfo> 

int main() 
{ 
    int a = 10; 
    cout << typeid(int).name() << endl; 
} 

Czy istnieje lista symboli w dowolnym miejscu?

+0

może warto zauważyć, że jest to GCC pakiecie z MinGW. – aLostMonkey

+1

jeśli chcesz tylko śledzić typy, a następnie: 'if (typeid (a) == typeid (int)) {/ * action * /}'? – Donotalo

+0

Co próbujesz zrobić? Co dokładnie rozumiesz według listy symboli? – sellibitze

Odpowiedz

15

ja nie wiem, czy taka lista istnieje, ale można zrobić mały program, aby wydrukować je:

#include <iostream> 
#include <typeinfo> 

#define PRINT_NAME(x) std::cout << #x << " - " << typeid(x).name() << '\n' 

int main() 
{ 
    PRINT_NAME(char); 
    PRINT_NAME(signed char); 
    PRINT_NAME(unsigned char); 
    PRINT_NAME(short); 
    PRINT_NAME(unsigned short); 
    PRINT_NAME(int); 
    PRINT_NAME(unsigned int); 
    PRINT_NAME(long); 
    PRINT_NAME(unsigned long); 
    PRINT_NAME(float); 
    PRINT_NAME(double); 
    PRINT_NAME(long double); 
    PRINT_NAME(char*); 
    PRINT_NAME(const char*); 
    //... 
} 
+0

wielkie dzięki, niezbyt pewna, dlaczego to mi nie przyszło do głowy. To działa idealnie. – aLostMonkey

+5

'szablon nieważne PRINT_NAME() {std :: cout << ...}' – Potatoswatter

+0

@Potatoswatter i jak można obrysować T? Twoje rozwiązanie jest mniej skuteczne niż Bensa. –