是否有任何工具/方法来检测/删除所有未使用的变量,宏,头(包括)和函数从c++代码
Is there any tool / way to detect/remove all unused variables,macros,headers(includes) and functions from c++ code?
我不得不自定义一些为其他目的编写的项目,但一些核心功能对于我的项目和工作是一样的。但是有很多变量、宏、函数等。这对我当前的上下文没有用处,它们只会使代码非常不容易阅读,并且不必要地变大。
所以我开始删除变量、宏函数等。通过使用Netbeans中的"查找引用"answers"显示调用图"。我使用netbeans远程开发工具的c/c++。但这很麻烦。有什么工具可以清理吗?
据我所知,目前还没有工具可以完成您提到的所有事情,但是有一个工具可以帮助清理未使用的包含头:include-what-you-use
"包含你所使用的"意味着:对于每个符号(类型,函数变量(或宏)在foo中使用。Cc,或者foo。Cc或foo.h应该包含一个导出该符号声明的.h文件。include-what-you-use工具是一个程序,可以使用Clang库以分析#include的源文件来查找包括你使用的违规,并建议修复它们。
include-what-you-use的主要目标是删除多余的#include。它通过找出这个文件(对于.cc和.h文件)实际上不需要的#include和在可能的情况下用forward- declarations替换#include
有人可能期望Clang静态分析器能做到这一点,但是从我所看到的可用的检查不提供这样的东西。
这可能是一个很好的时机,有人可以向分析器提出一个特性请求,或者使用libtool创建一个单独的工具,类似于Clang tools
中描述的工具。与此同时,我建议您启用-Wall和-Wextra编译器标志,这将触发以下警告(其中包括)(参见下面的GCC文档):- -Wunused-function
- -Wunused-label
- -Wunused-value
- -Wunused-variable
- -Wunused-parameter
- -Wunused-but-set-parameter
如果出于某种原因你不想这样做,你可以添加-Wunused,这将只启用上述-Wunused选项组合,而不使用-Wall或-Wextra添加的其他标志。
但是为了获得关于未使用的函数参数的警告,您必须指定-Wextra -Wunused(注意-Wall意味着?-Wunused),或者单独指定-Wunused-parameter。
当然,这意味着您必须手动进行清理
如果您想要更加迂腐,您可以通过添加-pedantic-errors标志
将所有警告转换为错误。有关更多详细信息,请参阅GCC警告选项文档
我有时用添加
标记一大段代码为"未使用"的方法#if 0
... lots of code
#endif
然后可以编译代码,看看哪里出了问题。分析您得到的"未声明的变量X"错误,并恢复该错误所需的位。你可以通过"切割"#if 0
块(添加一个#endif
,然后再往下添加一个新的#if 0
),或者通过将你需要的块移出当前块来做到这一点。例如,如果您有一个全局变量或宏块,只需将#if 0
放在它们周围,并查看实际使用的是哪些。[虽然如果在#ifdef
等中使用宏可能会更棘手]。
如果没有工具,我会很惊讶,但与此同时,你仍然需要做切割工作,一旦你在#if 0 ... #endif
中有一大块代码,就很容易把它剪掉。
许多静态代码分析工具提供您想要的信息。维基百科有一个列表。我们已经成功地使用了这样一个工具(通过一些自定义的更改)来删除包含并加快编译时间。
- 简化C++包括变量名称和函数输出的模式
- 使用模板参数还包括 constexpr 成员函数enable_if单独定义和声明模板成员函数
- 重构MFC消息映射以包括完全限定的成员函数指针
- 如何创建一个函数,该函数在文本中查找单词的匹配项,包括跳过
- 在C 中将全局函数包括在命名空间中
- 如何从函数中返回迭代器,包括结束案例
- 为什么不是条件 *First1 == * First2 ??(C++ STL 包括函数实现)
- 为什么在对自定义对象的向量进行分类时,我们将在struct的定义中包括比较函数
- 我的C程序如何可以从C 文件调用函数,而无需包括标头
- Openssl 线程安全回调函数注册,包括直接调用和间接调用
- 我可以从C 中的库中包括/导入单个函数吗?
- 对"main"的未定义引用 - 但包括 main 函数
- 在不使用c++中的库函数的情况下,计算不包括null字符的字符串长度
- Doxygen 不显示如何从其他类调用记录的成员函数(包括构造函数)
- 包括arduino中单独文件中的函数
- 包括模板函数
- 缓存函数的结果可能包括void
- 在对象中存储一个std::函数,该函数包括std::占位符
- 名称空间,包括cpp文件中具有相同名称的函数
- 链接器错误:对“vtable for square”的未定义引用.代码包括虚拟函数