GCC:减少输出中的模板名称

时间:2013-12-02 00:35:18

标签: c++ gcc

在我的C ++代码中,我经常使用模板......这可能是轻描淡写。最终结果是类型名称占用超过4096个字符,并且至少可以看到GCC输出是痛苦的。

在GDB或Valgrind等几个调试包中,可以请求不对C ++类型进行解码。有没有类似的方法迫使G ++输出损坏的类型名称,削减所有不必要的输出?

澄清

由于给出了第一个答案,我看到问题不明确。请考虑以下MWE:

template <typename T>
class A
{
    public:
        T foo;
};

template <typename T>
class B
{       
};

template <typename T>
class C
{
    public:
        void f(void)
        {
            this->foo = T(1);

            this->bar = T(2);
        }
};

typedef C< B< B< B< B< A<int> > > > > > myType;

int main(int argc, char** argv)
{
    myType err;

    err.f();

    return 0;
};

仅当实例化this->bar = T(2);类型的对象并调用方法C<myType>时,行C::f()中的错误才是错误。因此,G ++会沿着这些行返回错误消息:

test.cpp: In instantiation of ‘void C<T>::f() [with T = B<B<B<B<A<int> > > > >]’:
test.cpp:33:8:   required from here
test.cpp:21:14: error: no matching function for call to ‘B<B<B<B<A<int> > > > >::B(int)’
    this->foo = T(1);
              ^
test.cpp:21:14: note: candidates are:
test.cpp:11:7: note: B<B<B<B<A<int> > > > >::B()
 class B
       ^
test.cpp:11:7: note:   candidate expects 0 arguments, 1 provided
test.cpp:11:7: note: B<B<B<B<A<int> > > > >::B(const B<B<B<B<A<int> > > > >&)
test.cpp:11:7: note:   no known conversion for argument 1 from ‘int’ to ‘const B<B<B<B<A<int> > > > >&’
test.cpp:21:14: error: ‘class C<B<B<B<B<A<int> > > > > >’ has no member named ‘foo’
    this->foo = T(1);
              ^
test.cpp:23:14: error: no matching function for call to ‘B<B<B<B<A<int> > > > >::B(int)’
    this->bar = T(2);
              ^
test.cpp:23:14: note: candidates are:
test.cpp:11:7: note: B<B<B<B<A<int> > > > >::B()
 class B
       ^
test.cpp:11:7: note:   candidate expects 0 arguments, 1 provided
test.cpp:11:7: note: B<B<B<B<A<int> > > > >::B(const B<B<B<B<A<int> > > > >&)
test.cpp:11:7: note:   no known conversion for argument 1 from ‘int’ to ‘const B<B<B<B<A<int> > > > >&’
test.cpp:23:14: error: ‘class C<B<B<B<B<A<int> > > > > >’ has no member named ‘bar’
    this->bar = T(2);

这里的类型名称很烦人,但是当完整的类型名称需要数百个字符时,无法读取。有没有办法向GCC询问损坏的类型名称而不是全名,或以某种方式限制其长度?

STLFilt

不幸的是,STLFilt只会使输出更漂亮;长度不会改变。事实上,输出被分成多行的事实使整个事情变得更糟,因为输出占用更多空间。

3 个答案:

答案 0 :(得分:2)

人们正在遭受C ++错误报告的特殊缺点。 :)

但是,更复杂的错误报告通常更适合复杂的问题解决。因此,更好的方法是让g ++吐出冗长而冗长的错误消息,然后使用独立的错误解析器使输出更具可读性。

这里曾经有一个像样的错误解析器:http://www.bdsoft.com/tools/stlfilt.html(不幸的是,不再在开发中)。

另见近似重复:Deciphering C++ template error messages

答案 1 :(得分:1)

这永远不会奏效。制作模板类时:

B<A<int> >

这个类在其定义中不再具有函数f()。如果用clang ++编译它,你会得到错误(测试的类型为B<A<int> >):

error: no member named 'f' in 'B<A<int> >'
        test.f();
        ~~~~ ^

如果您想要稍微更易读的错误,请尝试使用clang ++。

答案 2 :(得分:0)

您可以使用typedef

typedef queue<int> IntQueue;

显然,在这个示例中,您只删除了2个字符类型名称,但是使用更复杂的示例,这将缩小更多字符,并提高代码的可读性。

此外,这可能有助于IDE的自动完成功能(如果使用的话)。