【发布时间】:2016-11-30 09:48:25
【问题描述】:
我从一个较大的 (C) 项目中剪下了一段代码。该代码在许多地方定义了许多宏 - 其中一些仅由原始的、更大的代码库使用,而不被我剪切的部分代码使用。
我想快速确定哪些宏在实际使用中,哪些不是(以便我可以删除那些没有使用的)。我不在乎使用它们的代码路径是否被占用(即if (1+1 == 3) { MY_MACRO(a,b,c); } 就我而言是一种用途。
有什么好的方法可以做到这一点?我能想到的最好的方法是使用 -E 预处理所有内容,并查找以某种方式提及宏的源位置 cmets。
注意事项:
- 如果您的解决方案还列出了正在使用的功能,那也没关系。
- 我只在我从项目中剪切出来的代码中直接调用某些函数。如果您的解决方案可以将列出的宏限制为实际上从入口点调用的函数中的宏,那就更好了
- 我的代码编译并运行(如果有帮助,您可以假设 gprof 输出)
- 仅仅注释掉所有的宏,虽然显然可行,但很麻烦;所以我想要一个不需要我这样做的解决方案。
- 预处理器排除的代码未使用;但是,如果您有一个不遵守此限制的解决方案,那总比没有好。
- 我不想"dump the list of preprocessor defines" - 而是那些正在使用的定义。
【问题讨论】:
-
注释掉所有
#define指令并重建。检查投诉的符号。 -
旁注:由于您的代码可以编译,请记住比较宏删除前后的二进制文件。您可能会不小心删除了条件编译中使用的宏,而不会收到警告或错误。
-
@Someprogrammerdude:见编辑。我想比那更懒惰。
-
预处理器排除的代码呢?如果宏
FOO被排除在外,例如#ifdef DEBUG,是否应该列出它? -
@deniss:未使用。但请参阅编辑。
标签: c macros static-analysis dead-code