VS C++ 2008:修改输出文本?
Posted
技术标签:
【中文标题】VS C++ 2008:修改输出文本?【英文标题】:VS C++ 2008: Modifying Output text? 【发布时间】:2010-02-20 16:25:24 【问题描述】:我使用的是 Visual Studio C++ 2008 Express Edition。
是否可以针对编译(或其他)错误修改输出窗格中的文本?
例如,我可能会收到一条错误消息:error C2556: int Class::getResult(void) + a lot more relative garbage。
我可以解析输出文本并轻松找到并修复我的错误。如果我可以修改错误以使它们更清晰、更短、更友好,那仍然会很好/有用。一个例子是收到一条错误消息:“Source.cc (Line 10): Missing a closing;”
【问题讨论】:
除非你自己写一个编译器,否则似乎不可行。 jcyang - 我开始想那么多了。错误信息可能是编译器软件设置的。 【参考方案1】:您必须了解一些事情。编译器确实在尽力而为;它会准确地告诉你失败的地方,以及直到那时为止的整个编译过程。它不知道你打算写什么,它知道你写了什么,那么它怎么可能假设错误是由其他更远程的东西引起的呢?我认为,如果您正在编写它并达到使错误“更清晰、更短、更友好”的地步,您会意识到这比看起来要困难得多。
在某些情况下它可以做到这一点,而且编译器似乎在建议它们方面做得越来越好。例如:
if (x);
x = 5;
产生警告:
警告 C4390: ';' : 找到空的受控语句;这是本意吗?
但他们不能总是那样做。
话虽如此,一旦您稍微了解了语言并理解了它的含义,错误消息确实是您解决问题所需的全部内容。我认为模板错误是“邪恶和神秘的”是一个巨大的神话和夸张。虽然它们可能很冗长,但它们真的一点也不难理解。我不认为模板错误是神秘的,我认为是读者不知道如何很好地阅读它,这使它看起来神秘。但如果你慢慢来,你就会清楚地看到它试图做什么以及失败的地方。
在下一个标准 C++0x 中出现了一个叫做“概念”的东西,它可以极大地解决这个问题。它们有点像类可以适应的标签,如果它们支持标签所说的所有东西。因此,在std::copy
中,不会出现关于无法在某事上调用operator=
的错误以及传播的错误,而是会简单地得到类似“错误:类型不是 CopyAssignable”的信息,就是这样。同样的错误,不同的表现。这也是他们现在被淘汰的原因。事实证明它们很麻烦,而且因为它无论如何都是语法糖,所以在其他事情上工作更重要。希望有一天我们能见到他们。
现在,有一个名为 STLFilt 的工具,它可以过滤与 STL 中的内容有关的模板错误。我从未使用过它,但我不止一次听说它推荐过。这是他们的sample filters 之一。你可以试试看。
因为您似乎认为这在语言本身中是可以做到的:不。该语言没有关于错误消息应该是什么样子、应该警告什么、不应该警告什么的概念。
您会在第 1.4/2 节的标准中找到我的意思。总结一下,它基本上是说“如果有错误,输出一些关于它的东西”。就是这样。
【讨论】:
Gman,正如原帖中所说,我已经可以很容易地解析输出,并且很容易修复我的错误。我想知道的是是否可以将输出文本更改为更友好的内容。在 C++ 中的某个地方 - 也许这是在编译器本身中定义的,当生成 ERROR X 时,它伴随着文本“ERROR X:你犯了这样那样的错误”。我想知道是否可以将文本更改为“错误 X:此错误代码 = 此问题,请在第 y 行修复此问题”。 @Matt:不,你需要成为编译器编写者,并且在这方面做得非常好。你过分简化你的任务;你很容易想到“显然,我应该去这条线修复它”,但你是一个人。 计算机在识别事物方面没有那么奢侈,你的任务可能会非常困难。 所以错误信息是由编写编译器的实体决定的?即,它们不能改变吗?太好了,回答了我的问题,尽管我希望不是这样。 @Matt:确实。编译器提供了插入的方法,因为 STLFilt 充分利用了它,但总的来说,我认为它们是相当硬编码的。【参考方案2】:想尽办法解决这个问题很容易。编译器本身是一个名为cl.exe
的命令行程序。如果你想过滤它的输出,你需要做的是创建一个程序,它也被命名为cl.exe
。它需要将所有命令行参数传递给原始的cl.exe
。然后它将原始生成的任何内容作为标准输出上的消息,解析它们,用您喜欢的消息替换它们,并将它们打印到自己的标准输出中。
当您这样做时,您可能希望至少以原始格式保留有关出现问题的文件和行的信息。 IDE 解析并使用它来支持在错误之间导航(例如,使用 F4 或双击)。
【讨论】:
嗯,这给了我一些思考。现在只是有点遥不可及;至少我的想法不再是,引用辛普森一家的话,“不可能”。谢谢杰瑞。以上是关于VS C++ 2008:修改输出文本?的主要内容,如果未能解决你的问题,请参考以下文章