Ответ 1
STLFilt: дешифратор сообщений STL для С++ - популярный инструмент для фильтрации этих подробных сообщений об ошибках и превращения их в нечто более разборчивое.
На своем веб-сайте:
STLFilt был первоначально задуман как учебное пособие, чтобы позволить учащимся проведение семинаров на C++ и/или STL, чтобы иметь смысл типично сообщения об ошибках с превышением STL. Сегодня, однако, даже некоторые эксперты С++ приняли STLFilt для использования в повседневном развитии. Результаты могут не всегда совершенны, но большую часть времени потерянная информация во время дешифрования не имеет решающего значения для отлаживаемого приложения. В остальное время расшифровка достаточно проста, чтобы обойти.
Распределение для каждой платформы (набор компиляторов/библиотек) самодостаточны и настроены на особенности этой платформы. каждый Perl script выполняет базовые регулярные выражения для всех стандартных (и расширенные, если они присутствуют в библиотеке) компоненты STL, в то время как некоторые версии script идут дальше в отношении сообщения упорядочение, обертка строк, обработка ошибок заголовка библиотеки и т.д., так как я в одностороннем порядке считается подходящей для этой платформы.
Здесь демонстрационный прогон, который показывает, как это может быть полезно:
Исходная программа:
#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; }
Во-первых, нефильтрованный прогон с использованием компилятора MinGW gcc 3.2:
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 * '
И отфильтрованный прогон с использованием gcc-специфического прокси С++:
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
[Примечание: демонстрационные прогоны выполнялись в консольном окне с 80 колонками с Включена обтекаемая интеллектуальная линия STLFilt и внутренняя переключатели, предназначенные для создания сообщений как можно более краткими. Более подробно доступный путем адаптации параметров Decryptor.]
Единственный недостаток, который я вижу, заключается в том, что он помещает Стандартную библиотеку С++.: (
Здесь соответствующая статья журнала автором STLFilt.