2011-11-02 26 views
12

Podczas programowania w języku C++ STL lub intensywnego używania "templatyzacji" i błędów kompilacji często raport o błędzie jest naprawdę długi i często zbyt wiele niepotrzebnych informacji jest podawanych. mówię gcc, ja nie wiem, czy z innych kompilatorów jest inny, ale czasami nawet tylko na literówki, to zajmuje trochę czasu, aby złapać błąd oczyszczenieJak radzić sobie ze zbyt długim raportem błędów szablonu STL?

<ns::type<ns::type<ns::type, ns::type<...><ns::type<...> > > > > 

szukam dla pewnej flagi kompilatora, triku, obejścia lub metodologii (obecnie kopiuję po błędzie i umieszczam dwie linie, co mam i jakiego kompilatora używam, aby chcieć i usuwać zmienne zakładki ... (trochę smutna procedura dla niezbyt często ctrl + s nie wykonano dobrze)), który mógłby przyspieszyć to zadanie lub po prostu mi pomóc (nawet tylko niektóre z najważniejszych składni błędu IDE ...)

+4

Kompilacja z innym kompilatorem jest często bardzo, bardzo przydatna. gcc, Visual C++, kompilatory oparte na EDG (takie jak Comeau lub Intel C++) i Clang wszystkie produkują bardzo różne komunikaty diagnostyczne dla błędów kompilacji szablonów. Wszystkie z nich mają bardzo przydatne komunikaty diagnostyczne, a wszystkie z nich są całkowicie nieprzydatne. Jeśli kompilujesz z więcej niż jednym kompilatorem, istnieje znacznie większa szansa, że ​​otrzymasz bardziej przydatny komunikat diagnostyczny. –

+0

uhm, spróbuję tego. Myślałem, że są dość standardowe, ale nie jest to zbyt wygodne. – jalone

Odpowiedz

11

STLFilt: An STL Error Message Decryptor for C++ to popularne narzędzie do filtrowania tych szczegółowych komunikatów o błędach i włączania w coś bardziej czytelnego.

Z ich strony internetowej:

STLFilt był początkowo pomyślany jako pomoc dydaktyczna, aby umożliwić uczniom biorąc C++ i/lub warsztaty STL specyficzne sensu typowo komunikatów o błędach overbloated STL. Dziś jednak nawet niektórzy eksperci C++ przyjęli STLFilt do użytku w codziennym rozwoju. Wyniki mogą nie zawsze być doskonałe, ale w większości przypadków informacja utracona podczas deszyfrowania nie ma krytycznego znaczenia dla debugowanej aplikacji. Resztę czasu, odszyfrowywanie jest łatwe do ominięcia.

Dystrybucja dla każdej platformy (zestawu kompilatora/biblioteki) jest samodzielna i dostosowana do specyfiki tej platformy. Każdy skrypt Perl wykonuje podstawowe substytuty wyrażeń regularnych dla wszystkich standardowych komponentów STL (i rozszerzonych, jeśli są obecne w bibliotece), podczas gdy niektóre wersje skryptu idą dalej w odniesieniu do porządkowania komunikatu, oblewania wierszem, traktowania błędów nagłówka biblioteki, itp., jak I jednostronnie uznane za odpowiednie dla tej platformy.

Oto a demo run, który pokazuje w jaki sposób może być przydatna:

Program źródło:

#include <map> 
#include <algorithm> 
#include <cmath> 

const int values[] = { 1,2,3,4,5 }; 
const int NVALS = sizeof values/sizeof (int); 

int main() 
{ 
    using namespace std; 

    typedef map<int, double> valmap; 

    valmap m; 

    for (int i = 0; i < NVALS; i++) 
     m.insert(make_pair(values[i], pow(values[i], .5))); 

    valmap::iterator it = 100;    // error 
    valmap::iterator it2(100);    // error 
    m.insert(1,2);       // error 

    return 0; 
} 

pierwsze, niefiltrowane prowadzony przy użyciu GCC MinGW 3.2 kompilatora:

d:\src\cl\demo>c++2 rtmap.cpp 
rtmap.cpp: In function `int main()': 
rtmap.cpp:19: invalid conversion from `int' to ` 
    std::_Rb_tree_node<std::pair<const int, double> >*' 
rtmap.cpp:19: initializing argument 1 of `std::_Rb_tree_iterator<_Val, _Ref, 
    _Ptr>::_Rb_tree_iterator(std::_Rb_tree_node<_Val>*) [with _Val = 
    std::pair<const int, double>, _Ref = std::pair<const int, double>&, _Ptr = 
    std::pair<const int, double>*]' 
rtmap.cpp:20: invalid conversion from `int' to ` 
    std::_Rb_tree_node<std::pair<const int, double> >*' 
rtmap.cpp:20: initializing argument 1 of `std::_Rb_tree_iterator<_Val, _Ref, 
    _Ptr>::_Rb_tree_iterator(std::_Rb_tree_node<_Val>*) [with _Val = 
    std::pair<const int, double>, _Ref = std::pair<const int, double>&, _Ptr = 
    std::pair<const int, double>*]' 
E:/GCC3/include/c++/3.2/bits/stl_tree.h: In member function `void 
    std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::insert_unique(_II, 

    _II) [with _InputIterator = int, _Key = int, _Val = std::pair<const int, 
    double>, _KeyOfValue = std::_Select1st<std::pair<const int, double> >, 
    _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, 
    double> >]': 
E:/GCC3/include/c++/3.2/bits/stl_map.h:272: instantiated from `void std::map<_ 
Key, _Tp, _Compare, _Alloc>::insert(_InputIterator, _InputIterator) [with _Input 
Iterator = int, _Key = int, _Tp = double, _Compare = std::less<int>, _Alloc = st 
d::allocator<std::pair<const int, double> >]' 
rtmap.cpp:21: instantiated from here 
E:/GCC3/include/c++/3.2/bits/stl_tree.h:1161: invalid type argument of `unary * 
    ' 

I filtrowane uruchamianie przy użyciu Proxy C++:

d:\src\cl\demo>c++ rtmap.cpp 
    *** {BD Software Proxy c++ for gcc v3.01} STL Message Decryption is ON! *** 
rtmap.cpp: In function `int main()': 
rtmap.cpp:19: invalid conversion from `int' to `iter' 
rtmap.cpp:19: initializing argument 1 of `iter(iter)' 
rtmap.cpp:20: invalid conversion from `int' to `iter' 
rtmap.cpp:20: initializing argument 1 of `iter(iter)' 
stl_tree.h: In member function `void map<int,double>::insert_unique(_II, _II)': 
    [STL Decryptor: Suppressed 1 more STL standard header message] 
rtmap.cpp:21: instantiated from here 
stl_tree.h:1161: invalid type argument of `unary *' 

STL Decryptor reminder: 
    Use the /hdr:L option to see all suppressed standard lib headers 

[Uwaga: działa demo przeprowadzono w oknie konsoli 80-kolumnowej z inteligentnym zawijania linii STLFilt umożliwiły iz wewnętrznymi przełączników określonych produkować wiadomości jako lakoniczne, jak to możliwe. Więcej szczegółów można znaleźć pod adresem , dostosowując opcje Decryptora.]

Jedynym minusem widzę jest to, że mislabels się C++ biblioteki standardowej. :(

Oto a relevant journal article autor STLFilt za

+1

Chociaż może to teoretycznie odpowiedzieć na pytanie, [byłoby wskazane] (http://meta.stackexchange.com/q/8259), aby uwzględnić istotne części odpowiedzi tutaj, i podać link dla odniesienia. – Kev

+0

@Kev: Być może jednak zapisy w dół powinny być zarezerwowane dla niepoprawnych informacji, a nie "źle przedstawionych" informacji. EDYCJA: Ta analogia nie obejmuje nawet tego konkretnego pytania i odpowiedzi. – GManNickG

+1

@GMan - Nie widziałem nawet, jak głosowano na głos, gdy sprawdzałem flagę. Odpowiedzi, które są tylko linkami, są odradzane, ale chcielibyśmy zobaczyć ich kopie z podsumowaniem tego, co użytkownicy prawdopodobnie zobaczą na drugim końcu. Dodaje także więcej miału do młynka z wynikami wyszukiwania. – Kev

4

Kilka osób wykonaną narzędzia do wykonywania tego, co nie ma nic wbudowana Tony w Google, ale górne powraca. Rezultat:. http://www.bdsoft.com/tools/stlfilt.html

To powinno być kompatybilny z visual studio i gcc.

edit ::

muszę wpisać mniej rzeczywiście dostać wejście w czasie :)

Powiązane problemy