当用c ++ STL编程,或者集中使用“模板化”,并且发生一些编译错误时,错误报告通常很长,并且通常会给出太多不需要的信息。 我在谈论gcc,我不知道与其他编译器有什么不同,但有时甚至只是一个错字,需要一段时间来捕捉错误清除
<ns::type<ns::type<ns::type, ns::type<...><ns::type<...> > > > >
我正在寻找一些编译器标志,技巧,变通方法或方法(我目前复制过去的错误,并把我所拥有的两行和编译器用来想要和删除变量书签... ...(有点悲伤的程序一个不那么罕见的ctrl + s执行得很好))可以让这个任务更快或者只是帮助我(甚至只有一些IDE错误语法突出显示......)
答案 0 :(得分:11)
STLFilt: An STL Error Message Decryptor for C++是一种流行的工具,用于过滤这些详细的错误消息并将其转换为更易读的内容。
从他们的网站:
STLFilt最初被设想为一种教学辅助工具,允许学生 参加C ++和/或STL专题研讨会,以了解典型情况 overbloated STL错误消息。然而,今天,甚至一些C ++专家 已采用STLFilt用于日常开发。结果可能会 并不总是完美,但大多数时候信息丢失了 在解密过程中,对于正在调试的应用程序并不重要。 其余时间,解密很容易绕过。每个平台(编译器/库集)的分布是 自包含,并调整到该平台的特性。每 Perl脚本为所有标准执行基本的正则表达式替换 (并扩展,如果存在于库中)STL组件,而 某些版本的脚本在消息方面更进一步 订购,换行,库头错误处理等,就像我一样 单方面认为适合该平台。
以下a demo run显示了它如何有用:
源程序:
#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特定的代理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
[注意:演示运行是在80列的控制台窗口中执行的 STLFilt启用智能换行,内置 开关设置为尽可能简洁地生成消息。更多细节是 通过定制Decryptor的选项来实现。]
我唯一能看到的缺点就是它错误地标记了 C ++标准库。 :(
这是STLFilt作者的a relevant journal article。
答案 1 :(得分:4)
有些人已经制作了工具来执行此操作,因为没有任何内置功能。 Tonnes在谷歌上,但最高结果返回:http://www.bdsoft.com/tools/stlfilt.html
它应该与visual studio和gcc兼容。
编辑::
我需要输入less来实际获得及时输入:)