使用编译器/链接器进行 C++ 代码清理

Posted

技术标签:

【中文标题】使用编译器/链接器进行 C++ 代码清理【英文标题】:Use Compiler/Linker for C++ Code Clean-up 【发布时间】:2008-10-15 06:52:37 【问题描述】:

我将 VS2008 用于 C++ 项目。代码很老,经过很多人的手。有几个不再使用的类层次结构、函数、枚举等。

有没有办法让编译器/链接器列出已声明或定义但未在任何地方引用的标识符?

【问题讨论】:

【参考方案1】:

VS 将警告在函数中声明但未使用的标识符,您可能需要移至警告级别 4,但对于全局变量,以及寻找许多其他潜在问题,您最好尝试 lint 或visual lint

【讨论】:

【参考方案2】:

PC-Lint“整个项目”分析(同时分析多个文件)可以做到这一点。如果您需要帮助设置,请随时与我联系。

【讨论】:

【参考方案3】:

不确定 Visual C++,但 g++ 会警告未使用的变量。您可以尝试通过 g++ 传递您的代码。

【讨论】:

这只会显示未使用的变量。如果我没看错的话,Vulcan 会写关于根除整个未使用的类和类型的文章。【参考方案4】:

http://en.wikipedia.org/wiki/Lint_programming_tool http://www.gimpel.com/

【讨论】:

【参考方案5】:

PC-Lint 会这样做。但是,不要一无所有地运行它。我做到了并且有 120 万个错误——相当于每行约 5 个。这被大大推高了,因为几乎每个 UI 类都引用了 resource.h 和 resource.h 列出了很多 #defines,lint 说“用 const int 替换定义”。一个好的起点阅读this post on the Power of 2 blog。

【讨论】:

【参考方案6】:

对于最明显的未使用声明,高警告级别会解决这个问题。

关于未使用代码的识别,deadstripper(不是深夜犯罪剧的中心,而是在链接期间剔除未使用代码的机制)只会让您部分获得帮助 - 您真正想要的是一个代码覆盖率分析工具。存在很多,不幸的是它们都相当昂贵。

具有良好上下文标记和调用图机制的强大编辑器也会有所帮助。

【讨论】:

"...,不幸的是,它们都相当昂贵。" PC-Lint 的成本约为 250 美元。我们在这里使用的是 7.5,它来自 3.5" 软盘,并拥有 1998 年的版权。因此,我们拥有它的 10 年时间相等,每年的成本约为 27 美元,这真是太少了。【参考方案7】:

参考 Graham 的帖子:FWIW 我从未真正看到使用 resource.h 文件的“用 const int 替换定义”消息 - 尽管其他一些(之前在同一位置定义)可能会很痛苦。

无论如何,如果某个特定的 PC-Lint 消息妨碍了您发现您正在寻找的内容,那么在您的 options.lnt 文件中使用 -e 将其关闭是一件简单的事情。还需要注意 -w 选项,它允许您全局设置警告级别(例如 -w0 +e766 关闭除消息 766 之外的所有内容)。

对于未使用的符号和声明,您需要注意诸如 755(信息——未引用全局宏)、758(信息——未引用全局枚举)、769(信息——全局枚举常量)等消息未引用)和 1714(信息 -- 未引用成员函数)。请记住,这些在单个文件分析中被抑制,因此您需要运行整个项目分析才能看到它们。

【讨论】:

以上是关于使用编译器/链接器进行 C++ 代码清理的主要内容,如果未能解决你的问题,请参考以下文章

C++ 和 C 是不是使用相同类型的链接器?

C++系列:链接器是如何工作的

C++中const使用注意要点

浅谈C++编译原理 ------ C++编译器与链接器工作原理

C编译器链接器加载器详解

在 C 和 C++ 中,链接器如何找到具有已实现函数的正确文件?