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.
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.]
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. –
uhm, spróbuję tego. Myślałem, że są dość standardowe, ale nie jest to zbyt wygodne. – jalone