如何在庞大的代码库中找到悬空命名空间或预处理程序指令

时间:2012-04-11 13:05:24

标签: c++ visual-studio visual-studio-2010

我们怀疑代码中有这样的东西,

所以也许#ifdef没有#endif或者名字命名空间foo {没有},在数百万的代码库中定位这样的东西的策略是什么?成千上万的文件,有没有办法使用正则表达式?

编辑 - 忘记提及(这是真正邪恶的部分)我们称之为在此代码中生成的统一文件将每个cpp文件拉入一个大的超级cpp文件。因此,编译器可能不会报告缺少大括号或不匹配的else / ifs,因为它们可以很容易地运行到接下来的几亿行代码中......

7 个答案:

答案 0 :(得分:1)

正则表达式无法真正找到匹配的大括号,特别是如果它们是嵌套的。

我认为最好的方法是确保所有代码都正确缩进,然后很容易看到缺少的东西。

除此之外,它是从结束开始的手工劳动匹配。希望它只需要很少完成。另请注意,大多数面向编码的现代文本编辑器都非常擅长匹配大括号和圆括号等内容。

答案 1 :(得分:1)

编译器和预处理器抱怨不匹配的#if / #endif对或不匹配的大括号。找到编译器抱怨的第一个文件,并手动“捏”它直到它编译。<​​/ p>

(不,标准正则表达式不能匹配嵌套到任意深度的对。)

答案 2 :(得分:1)

  

如何在庞大的代码库中找到悬空命名空间或预处理程序指令

在visual studio中按Ctrl+]将导致光标跳转到匹配的大括号或endif语句。当你找到一个光标无法跳跃的支撑时,它就是“悬空”。另外,您可以折叠部分代码,这可以帮助您找到不匹配的支撑。

我还建议读取实际的编译器输出而不是错误列表。

  

拥有数十万个文件

在第一个错误时终止编译,调查导致错误的文件,修复错误,再次尝试编译。使用“编译”而不是“构建解决方案”一次编译一个文件。 “询问”编译器生成包含插入的文件的输出列表(VS2008 cl.exe中的/ E或/ P开关),然后调查生成的文件。

如果这也不起作用,你将不得不花一些时间编写一个用python / perl编写的小解析器 - 那个将检查匹配大括号的解析器。

答案 3 :(得分:1)

两个步骤:

  1. 使用常规构建(不是可怕的统一构建)来查找错误
  2. 如果编译器没有使用适当的标志捕获错误,请切换到另一个
  3. 请注意,使用智能编译器,它甚至可以使用统一构建。

    -Wscope与Clang一起使用,如果作用域(例如命名空间)在文件(如标题)中启动但未在此处结束,则会收到警告。可以在the mailing list上找到引入此功能的补丁。它将在3.1版本中提供。

    我认为Clang中没有等效的预处理程序指令。

答案 4 :(得分:0)

这不是一个完整的答案,但我确实发现使用这个正则表达式很有帮助:

// *\#if|\#el|\#en

搜索//后跟任意数量的空格(包括无),然后搜索#if,#el或#en(以排除抛出所有pragma等的可能性 - 这肯定可以改进。< / p> 幸运的是,我只需要在我的公开文件中搜索,这是几百个,但可能会更糟糕。希望这有助于未来的人,这太可怕了!

答案 5 :(得分:0)

答案是不(有效地)将100000个文件粘贴到一个文件中,这样当编译每个文件时,编译器会立即知道哪些内容不匹配。然后,使用生成的错误消息和正常的代码检查来查找缺少的指令或大括号应该是微不足道的。

答案 6 :(得分:0)

这可能与您的问题无关,但我得到了一个&#34;意外的#else&#34;在#if /#else /#endif块中构建一些头文件时出错。

我发现如果我将问题模块设置为不使用预编译的标头,则问题就会消失。与&#34; #pragma hdrstop&#34;有关。不应该在#if /#endif中。