【问题标题】:GCC: cutting down template names in outputGCC:减少输出中的模板名称
【发布时间】:2013-12-02 00:35:17
【问题描述】:

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

在 GDB 或 Valgrind 等几个调试包中,可以要求不要对 C++ 类型进行解组。是否有类似的方法强制 G++ 输出only 错位的类型名称,切断所有不必要的输出?

澄清

由于给出的第一个答案,我发现问题并不清楚。考虑以下 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-&gt;bar = T(2); 行中的错误仅在实例化C&lt;myType&gt; 类型的对象并调用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 询问损坏的类型名称而不是全名,或者以某种方式限制它们的长度?

STL过滤

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

【问题讨论】:

  • +1 大量使用模板。
  • 澄清一下,您希望错误消息将类型命名为_ZN9wikipedia7article8wikilinkC1ERKSs 而不是wikipedia::article::wikilink::wikilink(std::string const&amp;)?如果没有,您能否说明“损坏的类型名称”是什么意思? (即,您希望输出是什么样的?)
  • @c45207:可能是这样。任何比我得到的更短的东西。例如,如果递归在第一级之后停止并显示 std::vector<:vector>> 而不是 std::vector<:vector>> 之类的东西会很酷。

标签: c++ gcc


【解决方案1】:

多年来,人们一直深受 C++ 错误报告这一特殊缺陷的困扰。 :)

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

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

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

【讨论】:

  • 关于如何与 gcc 一起运行 STLFilt 有什么建议吗?我无法理解它,它的网页也没有帮助:)。
  • 压缩包中包含一个名为“gfilt”的脚本。只需使用它代替 g++:./gfilt -c program.cpp
  • 不幸的是,STLFilt 仍然会产生很长的类型名称,只是现在它们被分解成更易读的东西。问题是,我根本不想要它们:大多数时候我只需要文件和行号。我还没有找到限制类型名称长度的命令行选项,有吗?
  • 是什么阻止您在 STLFIlt 中编辑 perl 脚本?它相当简单。
  • 了解 perl 和 STLFilt 的内部工作原理,但一旦无法使用,我会尽快处理..
【解决方案2】:

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

B<A<int> >

这个类的定义中不再有函数 f()。如果你用 clang++ 编译它,你会得到错误(其中 test 的类型是 B&lt;A&lt;int&gt; &gt;):

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

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

【讨论】:

  • clang++ 吐出 in 'B&lt;A&lt;int&gt; &gt;' 的事实已经是一个问题,因为在我的情况下类型名称非常长。
  • 我的意思是,错误消息更具可读性。 clang++ 给出了一个错误,比如(而不是 g++ 所做的):st_20319104.cpp:21:19: error: no member named 'bar' in 'C&lt;B&lt;B&lt;B&lt;B&lt;A&lt;int&gt; &gt; &gt; &gt; &gt; &gt;' this-&gt;bar = T(2); 另一种选择是使用类似 STLFilt 的东西(虽然我有一段时间没用过)
  • 我得到了很多;尽管如此,完整的类名出现在错误消息中的事实是不行的; G++ 只是简单地吐出两次,但一次就够糟糕了。我会看看 STLFilt 看看是否有帮助。
【解决方案3】:

你可以使用typedef:

typedef queue<int> IntQueue;

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

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

【讨论】:

  • 抱歉,我可以减少代码中的类型名称长度,但这并没有改变 GCC 在输出中生成完整类型名称的事实。见我上面的修订。
  • @Up-and-comingLaTeXMastah 在这种情况下,我也想知道答案。
猜你喜欢
  • 2023-02-11
  • 2012-10-04
  • 2021-12-30
  • 2022-07-20
  • 2017-08-17
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多