如何检查给定文件是否存在依赖项错误
How do I check whether given files have dependency bugs?
我对C++相当陌生,并被分配了以下任务:
鉴于我有以下文件集:alpha.cpp,bravo.cpp和charlie.cpp,我应该创建一个程序来检查这些文件是否有依赖项错误。
我的想法是让程序读取文件,创建一个邻接列表图,将每个文件作为顶点,如果一个.cpp文件包含另一个.cpp文件,则从一个节点到另一个节点的定向边。所以总的来说,我需要先对图表进行深度搜索,看看图表是否有任何后边缘。
这是正确的轨道吗?我觉得我明白我应该做什么,但我不确定如何准确实现它。
我会使用带有一点解析魔法的构建系统。 我有一个Makefile,我在这里用于很多项目。 它解析出包含并为其生成目标。
关于像Make这样的工具的事情是,它们必须为你做一个图形遍历。 他们通过获取所有部分排序(依赖项声明(并对其进行拓扑排序以获得完整的排序(文件的线性化,以便如果 A 依赖于 B,则 B 在 A 之前(来实现这一点。
但是,关于拓扑排序的事情是它只存在于直接无环图中。 因此,如果您生成像 Makefile 这样的依赖项,并且有任何循环,则构建将失败,这是您想要的,因为当您尝试递归包含内容时,无论如何都会发生这种情况。
顺便说一句:根据您问题中的评论对"依赖错误"的定义不是很有用。一般来说,包含b.h
包含a.h
a.h
不一定是任何类型的错误。如果包含它们的文件编译,那么显然您具有有效的C++。所以,不是错误。会出现以下情况:
-
给定的依赖周期可能是不必要的:某些
b.h
可能实际上不需要包含a.h
。编译成功。 -
给定的依赖循环可能是必要的,但有效:某些
b.h
可能需要来自a.h
的内容,并且它可能会向a.h
提供一些东西,但包含语句和依赖项是有序的,以便它工作。编译成功。 -
给定的依赖周期可能是必要的,并且无效:不可能满足所述的依赖关系。编译失败。
要检测 #3,您只需要编译文件,如果编译失败,则可能存在依赖项错误。
可能会对 a.h
和 b.h
中的声明/定义以及将 #3 转换为 #2 的包含语句进行重新排序。
2 和 #1 不一定是错误,但您必须完全解析文件以确定是否属于这种情况。
当然,您可以简单地声明这些循环在您的项目中是不允许的。所以它们违反了你的项目规则,也许这让你称它们为错误:)
如果您正在寻找工具来查看依赖项,我会考虑使用:
-
makedepend
或g++ -MD
(或clang++ -MD
(用于生成#include
依赖关系。然后构建一个图形来检测循环。 -
g++ -c
和nm
(-U
和--defined-only
(来读取目标文件中定义和需要的符号。您甚至可以比较已定义和声明的符号列表(包括像/usr/lib64/libstdc++.so.6
这样在某处定义的符号(,以查看是否缺少符号。
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在设计 SDK 时,我是否应该在 C++ 头文件中完全隐藏内部类?
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 如何将 UTF-8 文本从文件转换为某个可以迭代的容器,并检查每个符号是否为C++字母数字?
- 如何检查函数是否在LLVM Instrumentation pass的ModulePass的系统头文件中定义?
- 是否可以在没有真实文件的情况下创建 ifstream
- 是否可以使用 libclang python 解析 cpp 文件中没有标头的函数原型
- 在C++中使用没有合作伙伴Class/Cpp文件的头文件是否实用
- 是否可以使用 Python csv 阅读器读取使用 C++ std::setw 生成的文件?
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 是否可以在命令行中将输入参数传递给可执行文件
- 在头文件上包含 cpp 文件是否有缺点?
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 是否可以在文本文件中找到最长单词的长度,并在同一个文本文件中读取,只需 1 个 while 循环?
- 对同一文件使用 .read 的次数是否有限制?
- 如何检查流中文件的下一个单词是否为 alpha?
- 文件模式标志"ios::app"是否用于删除文件(如果文件已存在)?
- 使用 #include 将大量重复代码放入单独的文件中是否可以和/或正常?
- 如何检查文件是否已存在于 fstream C++中
- 是否有正确的方法对生成文件中的对象文件使用模板命令?(C++)