Как бороться со слишком длинным отчетом об ошибках шаблона STL? - PullRequest
14 голосов
/ 02 ноября 2011

При программировании на c ++ STL или при интенсивном использовании «шаблонизации», когда происходит некоторая ошибка компиляции, часто отчет об ошибках очень длинный, и часто дается слишком много ненужной информации.Я говорю о gcc, я не знаю, если с другими компиляторами отличается, но иногда даже для опечатки, требуется некоторое время, чтобы поймать ошибку очистки

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

Яищу какой-то флаг, трюк, обходной путь или методологию компилятора (в настоящее время я копирую ошибку и помещаю в две строки то, что имею и какой компилятор использую, чтобы хотеть, и удаляю переменные закладки ... (довольно грустная процедура для довольно необычногоCtrl + s не очень хорошо выполнил)), который мог бы сделать эту задачу быстрее или просто помочь мне (даже только некоторые синтаксические ошибки IDE выделите ...)

Ответы [ 2 ]

11 голосов
/ 02 ноября 2011

STLFilt: Расшифровщик сообщений об ошибках STL для C ++ - популярный инструмент для фильтрации этих подробных сообщений об ошибках и превращения их во что-то более разборчивое.

С их сайта:

STLFilt изначально задумывался как учебное пособие, позволяющее учащимся проходить семинары по C ++ и / или STL, чтобы разобраться в типично перегруженных сообщениях об ошибках STL.Сегодня, однако, даже некоторые эксперты C ++ приняли STLFilt для использования в повседневной разработке.Результаты могут не всегда быть идеальными, но большую часть времени информация, потерянная во время расшифровки, не является критичной для отлаживаемого приложения.В остальное время расшифровку достаточно легко обойти.

Дистрибутив для каждой платформы (набор компиляторов / библиотек) является автономным и настроен на особенности этой платформы.Каждый сценарий Perl выполняет базовые замены регулярных выражений для всех стандартных (и расширенных, если они присутствуют в библиотеке) компонентов STL, в то время как определенные версии сценария идут дальше в отношении упорядочения сообщений, переноса строк, обработки ошибок заголовка библиотеки и т. Д., А такжеЯ в одностороннем порядке считаю подходящим для этой платформы.

Вот демонстрационный прогон , который показывает, как он может быть полезен:

Исходная программа:

#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 ++ Standard Library .: (

Вот соответствующая журнальная статья автора STLFilt.

4 голосов
/ 02 ноября 2011

Несколько человек создали инструменты для этого, поскольку в них нет ничего встроенного. Тонны в Google, но возвращается лучший результат: http://www.bdsoft.com/tools/stlfilt.html

Должен быть совместим с Visual Studio и GCC.

редактировать ::

Мне нужно набрать меньше, чтобы получить ввод вовремя:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...