在Linux上,有什么方法可以快速识别C ++项目所需的#include
语句?
我的意思是,让我们说有人从网上给你一个片段,但未能提供必要的#include语句。是否有可能运行Linux命令或编译器命令选项并确定缺少哪些函数或类,以及作为奖励,在硬盘驱动器上识别我可能在头文件中包含这些内容。
答案 0 :(得分:4)
基本上你需要一些分析器来解析你的源代码和头文件,并建立一个完整的依赖图,它最终会吐出来让你进一步阅读和处理。
为了这个目的,我会遵循约翰关于g ++和Clang的建议,但我非常怀疑他们得到了什么。
你实际上可以做的,至少用g ++,打印出已经存在的包含的图表。使用-H选项打印树或使用-M获取列表。
我还会向您推荐这个相关主题:Tool to track #include dependencies
不完全是你想要的,但那里提到的工具可能会有所帮助。
答案 1 :(得分:2)
我认为Clang's "include-what-you-use" tool就是你想要的。
答案 2 :(得分:-1)
如果必要的话,你的意思是最小的(即如果A包括B和B包括C,那么A不需要包括C)我不知道快速的方式。
然而,一个好的方法是每个cpp文件首先包含它自己的头文件(在任何预编译头之后。)这确保每个头文件包括(直接或间接)定义符号所需的所有头文件在标题中使用。另外,合理大小的项目应该分层设计,使得A层知道/依赖于依赖于C层等的B层,但是较低层永远不会包含更高层(即C从不包括来自A层的任何东西)
在这种情况下,每个cpp或hpp中的包含应按层顺序(A,B,C)。如果你这样做,很容易检查是否可以删除任何C层标题(暂时注释掉),因为它们之前的一个包含已经包含它们。这种情况发生了很多,并且可以显着减少每个文件中的#includes数量。
说完所有这些,这是一个比以前更不重要的问题,因为编译器更聪明。 #pragma once和预编译头文件的组合可以缩短构建时间,而不需要花费大量时间来优化包含。
答案 3 :(得分:-1)
我知道在程序中找到未定义的标识符的最好方法就是尝试编译它。根据您正在使用的编译器,您可能只需将GCC或Clang的输出通过管道输入grep,查找“未声明的标识符”等短语。
至于确定符号的定义位置,我建议作为一个起点,查看Ctags来解析系统头文件(使用Makefile最好地管理)并使用生成的标签表来查找任何grep catch来自海湾合作委员会。
答案 4 :(得分:-2)
最快的方式......这不是你应该怎么想的。
https://stackoverflow.com/a/18544093/2112028
我写了一个可爱的(我很自豪:P)回答那里谈论链接如何工作(与模板)并证明它有效,等等,明白。
#include指令的目标是创建一个“转换单元”,其中声明每个符号(即使未定义)在我的答案中有一个例子,我只是将原型复制并粘贴到代码文件中,而不是使用包括。
你不应该担心“最快”的方式,如果你使用一个名为“Header guard”的东西(这些在底部简要提到,但这还不够详细),他们会这样:
#ifndef __WHATEVER_H
#define __WHATEVER_H
/*Your code here*/
#endif
所以现在你可以随意包含“whatever.h”。第一次在IN TRANSLATION UNIT中,将定义__WHATEVER_H,因此包含它的下一个文件(无论多少包括正在编译的文件中的深层)都将为空。因为#ifndef和#endif之间的所有内容都将消失。
希望这有帮助。
此外,如果您有不必要的输入,请使用-Wextra和-Wall,GCC将告诉您有关未使用的函数,typedef等信息。你可以使用pragma错误push和pop来控制它。例如,wxWidget的头文件可能包含很多未使用的东西,因此您将警告推送到堆栈,删除未使用的警告标志,包含文件,弹出警告堆栈(重新打开它们),少了几千行警告。