【问题标题】:Avoiding redeclaration errors without include guards在没有包含守卫的情况下避免重新声明错误
【发布时间】:2016-06-23 11:10:14
【问题描述】:

如果我想在不使用包含保护的情况下避免重新声明错误,那么依赖树必须是这样的基本规则:仅一棵或多棵树。

任何时候可以通过两种不同的方式联系到父母,那么就会发生违规行为?

例如:

declarations.h 包括 string.h
data.h 包括声明.h
data.c 包含 data.h
ui.c 包括 data.h 和 string.h

这会产生重新声明错误,因为 ui.c 和包含 string.h 有两种不同的方式:直接和通过 data.h。因此,该结构不是树,因为 ui.c 有多个路径到同一个父级。

有没有办法让多个路径指向同一个父级并且不会出现重新声明错误?

【问题讨论】:

  • 我不明白。请您更清楚地说明您的假设和真正的问题吗?
  • 与独特的依赖树相比,提出独特的包含守卫可能很多容易。你真正想做什么?
  • 让您的生活轻松自在,始终在您编写的每个头文件中使用“包含保护”。很简单,使用 _h 作为包含保护。查看任何系统头文件:#ifndef <filename>_h #define <filename>_h 并在文件末尾:#endif 这三行是所有需要添加到头文件以具有“包含保护”的内容
  • 我不想使用警卫。我想要一个不依赖守卫的干净依赖网络。我需要了解网络的可行形态才能实现这一目标。
  • 实现您想要的最简单的方法是“将所有内容放在一个文件中” - 这是一个非常明确的依赖关系。这也表明您想要实现的目标是多么不可取。你想要使用守卫——只是你还不知道而已。

标签: c include dependencies redeclaration


【解决方案1】:

研究了这个问题一段时间,似乎需要的图形形状不是树。基本上,只要图没有循环并且遵循一个基本规则,即到任何给定的父节点只能有一条路径,依赖关系就会是干净的。所以,例如:

因此,在这个网络中,我们看到父节点是共享的,子节点也可以共享,但是没有任何地方可以从同一个子节点到任何给定父节点的多条路由。形状的一个数学术语是不相交网络。在不相交的网络中,任何两条路径只能共享一个端点,而不能共享其他顶点/边。

【讨论】:

  • 我建议您从编译器和系统包含文件开始寻求纯度。确保您涵盖了定义交叉依赖关系的内容(即倾向于相互调用的模块),下一个乐趣将是回调及其相关的数据结构跨度>
猜你喜欢
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2019-10-05
  • 2012-01-19
  • 2015-09-08
相关资源
最近更新 更多