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);
类型名称在这里很刺激,但是当完整的类型名称需要数百个字符时才能读取。 有没有办法向海湾合作委员会索取类型名称而不是全名,或者以某种方式限制它们的长度?
STLFilt
不幸的是, STLFilt
只会使输出更漂亮; 长度不会改变。 事实上,输出分成多行的事实使得整个事情变得更糟,因为输出需要更多的空间。
人们正受到C ++错误报告这一特殊缺陷的困扰。 :)
但是,对于复杂的问题解决,更详细的错误报告通常更好。 因此,更好的方法是让g ++吐出长而冗长的错误消息,然后使用独立的错误解析器使输出更具可读性。
在这里曾经有一个体面的错误解析器:http://www.bdsoft.com/tools/stlfilt.html(不幸的是,不再在开发中)。
另请参阅此近似重复:解密C ++模板错误消息
这将无法工作。 当你创建模板类时:
B<A<int> >
这个类在其定义中不再具有函数f()。 如果你用clang ++编译这个,你会得到这个错误(其中测试类型为B<A<int> >
<A <int> B<A<int> >
):
error: no member named 'f' in 'B<A<int> >'
test.f();
~~~~ ^
尝试使用铿锵++,如果你想稍微更可读的错误。
你可以使用typedef
:
typedef queue<int> IntQueue;
很显然,在这个例子中,你只删除了2个字符的类型名称,但更复杂的例子会缩小更多的字符,并且会提高代码的可读性。
此外,这可能有助于IDE的自动完成功能(如果使用的话)。
链接地址: http://www.djcxy.com/p/17537.html上一篇: GCC: cutting down template names in output
下一篇: c++