我正在使用Visual Studio C ++ 2008 Express Edition。
是否可以修改“输出”窗格中的文本以进行编译(或其他)错误?
例如,我可能会收到一条错误,内容如下:错误C2556:int Class :: getResult(void)+更多相对垃圾。
我可以解析输出文本,轻松找到并修复我的错误。如果我可以修改错误以使它们更干净,更短,更友好,那将仍然很好/有用。一个例子是收到一个错误,上面写着:“Source.cc(第10行):没有结束;”
答案 0 :(得分:3)
您必须了解一些事项。编译器真的尽力而为;它告诉你它失败的确切位置,以及整个编译直到那一点。它不知道你打算写什么,它知道你写了什么,所以怎么可能假设错误是由其他更远的东西引起的?我认为如果你正在写它并且让错误变得“更清洁,更短,更友好”,你会发现它看起来要困难得多。
有些情况下,它可以做到这一点,编译器似乎越来越好地建议它们。例如:
if (x);
{
x = 5;
}
发出警告:
警告C4390:';' :发现空控制声明;这是意图吗?
但他们不能总是这样做。
所有人都说,一旦你学会了语言并理解这一切意味着什么,错误信息就是解决问题所需要的全部内容。我认为模板错误是“邪恶和神秘”是一个巨大的神话和夸张。虽然它们可能很冗长,但它们根本就不那么难以理解。我不认为这是模板错误是神秘的,我认为这是读者不知道如何阅读它,这使它看起来很神秘。但如果你花时间,你会看到它正在尝试做什么以及失败的地方。
有一种叫做“概念”的东西会出现在下一个标准C ++ 0x中,它会极大地解决这个问题。它们有点类似于类可以适应的标签,如果它们支持标记所说的所有内容。因此,在std::copy
中,不是因为无法在某些内容上调用operator=
而导致的错误,而是传播的错误,您只需获得类似“错误:类型不是CopyAssignable”的内容,那就是它。相同的错误,不同的表示。这也是他们现在被裁掉的原因。他们被证明是麻烦,因为无论如何它是语法糖,更重要的是处理其他事情。希望有一天我们会看到它们。
现在,有一个名为STLFilt的工具,它将过滤与STL中的事物有关的模板错误。我从来没有用过它,但我听过不止一次。这是他们的sample filters之一。你可以尝试一下。
因为你似乎认为这是语言本身可以做的事情:不。该语言没有关于错误消息应该是什么样的概念,或者应该警告什么或不应该警告什么的概念。
你会在1.4 / 2节的标准中找到我的意思。总而言之,它基本上说“如果有错误,输出一些关于它”。就是这样。
答案 1 :(得分:0)
在这个问题上尽最大努力。编译器本身是一个名为cl.exe
的命令行程序。如果要过滤其输出,您需要做的是创建一个名为cl.exe
的程序。它需要将所有命令行参数传递给原始cl.exe
。然后它会将原始产品作为标记输出上的消息,解析它们,用您喜欢的消息替换它们,然后将它们打印到自己的标准输出中。
当您这样做时,您可能希望至少保留有关原始格式出现问题的文件和行的信息。 IDE解析并使用它来支持在错误之间导航(例如,使用F4或双击)。