大家好,我是杰米·埃克曼。 上一次我发帖的时候,我是图书馆团队的SDET(测试人员)。 我后来加入了编译器团队,仍然是一名SDET。 我们在这两个团队中看到的一件事是编译器诊断:警告和错误。
我们的库开发人员之一,Stephan T。拉瓦维去年在我们的一份内部讨论清单上写道: 找出从“编译器抱怨什么”到“我的代码到底有什么问题,如果有什么问题的话”的映射,就像学习编程的75%。 根据你学习编程的方式,75%可能是夸张的,也可能不是夸张的,但重点很明显。 每个人迟早都会写出糟糕的代码,而对于新程序员来说,这是迟早的事(而且经常发生)。 因此,编译器发出的错误必须正确且足够清晰,以诊断问题。 在visualstudio的下几个版本中,我们正在对清晰性进行重大投资,以改进它。 现在,我将主要讨论正确性。
当我还在库团队的时候,我与诊断的唯一直接接触就是一些ATL服务器属性错误测试的维护。 但在很大程度上,我是从最终用户的角度来看编译器错误的: 我写的这个测试没有编译,为什么? 现在我在编译器团队中,拥有了C或C++代码编写时可能看到的大部分错误文本,我有一个很好的机会来看看我们的诊断工作是如何工作的以及如何测试它们。
编译器可以发出1000个错误和警告。 我们像您所期望的那样测试这些警告或错误,每个警告或错误都有一个或多个与之相关联的测试用例。 测试用例验证预期的诊断是否实际发出并且在正确的线路上发出。 当然,编译器是一个非常复杂的机制,问题必然会从缝隙中溜走。
我们UE团队的一位同事(用户教育、负责MSDN上的内容等)最近向我提供了一个小的代码片段列表 C/C++生成错误 MSDN中没有产生承诺错误的部分。 当您试图找出某个特定错误或警告的含义时,这些代码段非常有用。 通常,代码片段中的简化代码可以帮助您在自己的代码中发现问题。
因此,来自UE团队的Tim让我看看这些不起作用的片段,找出哪里出了问题。 一个编译器错误,一个我们忘记告诉UE的预期更改,或者其他什么? 举个例子,我看的第一个:
//C2062英国石油公司
//编译方式:/c
班 数据集{};
结构 我的数据控制器{
我的数据控制器( 内景 年龄,数据集*j){} //C2062型
//请改为尝试下面的行
//MyDataController(int age,DataSent*j){}
};
这是一个简单的错误,尽管可能不容易发现。 类名“DataSent”被错误地键入“DataSet”。 预期的错误是C2062,“意外的’DataSet’类型”。 实际发出的错误(使用最近的Orcas编译器)是C2061,“语法错误:标识符‘DataSet’”。 在这里我们看到,当涉及到错误消息时,正确性和清晰性通常有一个有趣的关系。 虽然我们没有得到预期的错误,但是我们得到的错误直接指向了问题。 我也许能够证明这是一个编译器错误,但是由于新错误在功能上和旧错误一样好,所以在Orcas发布周期的这个阶段不太可能修复它。
现在,这里有一个提示这篇文章的其余部分完全没有关系。 你们中的一些人可能已经知道这一点,但我还没有看到它发布在vcblog上。 我最近开始在一个新的代码库中工作,其中包含一组非常严格的编码约定。 其中一个约定是,任何内容都不应超过第79列。 每次接近行尾时都会看到状态栏中的列显示,这很烦人,但幸运的是,visualstudio有一个漂亮的隐藏特性可以提供帮助。 立柱导轨。 这涉及到编辑注册表,因此标准免责声明适用:修改注册表的风险由您自己承担!
在注册表中查找此项:
HKEY U当前用户软件MicrosoftVisualStudio9.0文本编辑器
对于VisualStudio2005,您需要使用“8.0”而不是“9.0”。 在文本编辑器键中创建一个新的字符串值并称之为“Guides”。 修改指南的数据并添加如下内容:
RGB(0,128,0)79
这将在第79列放一条绿线。 可以有多个辅助线:
RGB(0,128,0)79,RGB(128,0,0)49
确保在添加这些值以使更改生效后重新启动VisualStudio。
好好享受!
–杰米