如何在gcc错误消息中隐藏默认模板参数?

12

阅读g++生成的错误信息常常是一件痛苦的事情,因为gcc会扩展类似于

的名称。

std::ostream

我的代码变成了更长的形式,比如说

std::basic_ostream<char, std::char_traits<char> >

在错误信息中,同样地,gcc会将std::string扩展成std::basic_string<char>。我不认为这样的扩展有任何好处,只会让我难以将错误信息与错误位置联系起来。

我想知道是否可能告诉gcc禁用这种扩展行为,并直接使用默认模板参数的较短名称?

有一个相关的问题here,似乎是关于根本不显示长扩展名称。我在这里问的是是否可能仅显示我在代码中使用的短名称。那里的答案也没有解决问题。


4
Clang 在这方面做得相当不错。 - quantdev
无论gcc是否打印typedef取决于上下文,例如模板错误将始终输出完整类型,因为我记得使模板错误呕吐甚至稍微更易读并不是一件简单的事情。非模板错误,例如调用ofstream不存在的方法,使用typedef(至少在GCC 4.9中)。 - user657267
2个回答

2

没有编译器标志可以减少或更改错误消息及相关类型/模板。

  • gcc从gcc 4.9版本开始支持颜色显示,使用-fdiagnostics-color={auto, always, never}。文档请参见这里

有许多第三方工具可帮助您解密错误消息:

  • GCCFilter用于对错误消息进行着色和简化(Perl脚本)
  • ColorGCC也是同样的方式(Perl脚本),git在这里
  • STLFilt:一个专为STL相关诊断而设计的消息过滤器。请注意,它已不再得到支持/开发。

作为(非常好的)替代方案,clang编译器在诊断和错误消息方面非常出色


自GCC 4.9起,着色已经无用了,因为它包括“-fdiagnostics-color={auto, always, never}”。 - edmz

1

我怀疑你现在做不到。一种相似的选择是fno-pretty-templates,其作用如下:

-fno-pretty-templates
当错误信息涉及函数模板的特化时,编译器通常会打印模板的签名,然后是模板参数和任何typedef或 signature中的类型名称(例如void f(T) [with T = int]而不是void f(int)),以便清楚地了解涉及哪个模板。当错误信息涉及类模板的特化时,编译器省略与该模板的默认模板参数匹配的任何模板参数。如果以上任何行为使错误消息更难理解而不是更容易理解,则可以使用-fno-pretty-templates来禁用它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接