30

当人们说 C++ 的错误消息在模板方面非常糟糕时,我真的开始理解他们的意思。我已经看到了像函数与原型不匹配这样简单的事情的可怕的长错误。

有什么技巧可以破译这些错误吗?

编辑:我同时使用 gcc 和 MSVC。他们俩似乎都很可怕。

4

6 回答 6

16

您可以尝试使用以下工具使事情变得更加理智:

http://www.bdsoft.com/tools/stlfilt.html

于 2008-09-07T00:42:37.157 回答
10

我绝对不能。小错误会爆发成一页又一页的不可读的垃圾。通常在清晨,在喝咖啡之前。:(

我唯一的建议是深呼吸,从顶部开始,尝试解析重要的信息。(我知道,说起来容易做起来难,对吧?)。

于 2008-09-07T02:32:02.557 回答
5

正如@nsanders所说,STLFilt是一个很好的解决方案。一个自制的 STLFilt(当您不想麻烦安装 Perl 时)是在编辑器中复制错误消息并开始替换部分错误,直到它变得(更)易于管理。

例如

s/std::basic_string<char,std::char_traits<char>,std::allocator<char>>/string/g 

用不太令人讨厌的术语来说,这意味着:

代替:

std::basic_string<char,std::char_traits<char>,std::allocator<char>>

和:

string
于 2008-09-07T08:58:50.550 回答
3

一些编译器提供比其他编译器更好的消息。你用的是什么编译器?话虽如此,他们都很糟糕。C++0X 将解决这个问题的大部分(见概念),但标准要到 2009 年才会发布,广泛的支持可能会更晚:-(

于 2008-09-07T00:45:40.080 回答
2

至少在 Visual Studio 中,Output Build 窗口中提供了更多信息,而不是错误列表。我在错误列表状态中有一个模板错误,“无法将 Foo<int> 转换为 Foo<int>”。在“输出”窗口中的实际错误后面有几行帮助我破译了实际问题是什么。

于 2008-09-07T03:56:27.843 回答
2

尽管它是一个旧帖子,但这可能对其他偶然发现此帖子的人有所帮助。

我遇到了完全相同的问题,在我的情况下,错误甚至无法再打印到屏幕上,因为它们太长了。所以我将它们转储到一个文本文件中,并尝试使用文本编辑器进行一些基本搜索,而不是通过文件搜索,其中一些可能高达 20 MB(对于错误来说还不错)。大多数错误都会重复,因为我是并行编译的,所以这是另一个大问题。

当我对这种方法感到厌倦时(而且效率也不高),我开发了一个小的帮助程序,我可以将它直接链接到我的编译器工具链中,这样编译器生成的任何输出都可以根据一些规则进行格式化在 json 文件中定义。该程序可以在这里找到:https ://github.com/tomrobin-teschner/dotify

有三个基本功能:

  • 如果它包含某个字符串,则不要从编译器打印当前输出(行)
  • 如果包含关键字(可以着色),则仅打印特定行
  • 如果涉及模板,请删除 <> 括号之间的内容并用点替换它们。例如,MyClass<std::vector<double>, std::array<double, 3>>将简单地替换为MyClass<...>.

完整的错误消息仍然存储在日志文件中(如果需要更详细的信息,以后可以使用),解析器只处理打印到控制台的输出。

调用解析器的命令是

/path/to/program | tee log | /path/to/parser -f /path/to/inputFile.json

/path/to/program是要执行的程序(并且应该从中格式化输出) /path/to/parser -f /path/to/inputFile.json,解析器的位置,-f 标志指定输入文件(以 json 格式),对于一个非常简单的情况,它可能如下所示:

{
  "ignoreCompleteLineIfItContainsSubstring" : [
    "should be suppressed"
  ],
  "ignoreContentBetweenDelimiter" : [
    {
      "startingDelimiter" : "<",
      "endingDelimiter" : ">",
      "replaceContentBy" : "..."
    }
  ],
  "styleLineContainingKeywords" : [
    {
      "keyword" : "error",
      "removeDuplicates" : true,
      "applyStyle" : "onKeyword",
      "color" : "red",
      "style" : "bold"
    }
  ]
}

可以在项目站点 ( https://github.com/tomrobin-teschner/dotify )上找到完整的选项列表和说明

于 2020-04-30T15:19:34.900 回答