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

C++ 如何在gcc错误消息中隐藏默认模板参数?,c++,templates,gcc,C++,Templates,Gcc,读取由g++生成的错误消息通常是一件痛苦的事情,因为gcc扩展了如下名称 std::ostream 在我的代码中变成一个更长的形式,如 std::basic_ostream<char, std::char_traits<char> > std::basic_ostream 在错误消息中。类似地,gcc将std::string扩展为std::basic_string。我看不出这种扩展有什么好处,它只会让我很难将错误消息与错误站点联系起来 我想知道是否可以告诉gcc禁用

读取由g++生成的错误消息通常是一件痛苦的事情,因为gcc扩展了如下名称

std::ostream
在我的代码中变成一个更长的形式,如

std::basic_ostream<char, std::char_traits<char> >
std::basic_ostream
在错误消息中。类似地,gcc将
std::string
扩展为
std::basic_string
。我看不出这种扩展有什么好处,它只会让我很难将错误消息与错误站点联系起来

我想知道是否可以告诉gcc禁用此扩展行为,并按原样使用带有默认模板参数的较短名称


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

没有编译器标志来减少或更改错误消息和相关类型/模板

  • gcc支持自gcc 4.9以来使用
    -fddiagnostics color={auto,always,never}
    进行着色。请参阅文档

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

  • 用于错误消息的着色和简化(Perl脚本)
  • 同样(Perl脚本),git也是
  • :为STL相关诊断设计的消息过滤器。请注意,它不再受支持/开发

作为一个(非常好的)选择,我怀疑你现在能做到。一种关闭选项是
fno pretty templates
,其作用如下:

-fno漂亮的模板
当错误消息涉及函数模板的专门化时,编译器通常会打印函数模板的签名 模板后跟模板参数和任何typedef或 在签名中键入名称(例如,void f(T)[带T=int]而不是 void f(int)),以便明确涉及哪个模板。当 错误消息指的是类模板的专门化 编译器将忽略与默认模板匹配的任何模板参数 该模板的参数。如果这些行为中的任何一个成功了 更难理解错误消息,而不是更容易理解,您可以使用 -fn没有漂亮的模板来禁用它们


clang在这方面做得很好gcc是否会打印typedef取决于上下文,例如模板错误总是会吐出完整的类型,因为IIRC使模板错误吐出的内容更具可读性不是一件小事。非模板错误,例如调用流的
的不存在方法使用typedef(至少在GCC 4.9中)。由于GCC 4.9包括
-fddiagnostics color={auto,always,never}
,因此着色是无用的。