对不起,这是一个非常新手的问题。
我正在维护这个庞大的应用程序。它有5种不同的形式。我们将全局变量放在一个单元中(uGlobal)。但我似乎无法从数据单元(uData)访问它。
我有这个:
Unit uGlobal
type
TmyType: (alpha, beta);
...
Unit uGlobal
Stuff: TmyType <- error, undeclared indentifier
当我尝试将uGlobal放入uData的使用部分时,它会抱怨循环引用。所以,这里有点无能为力。他们都在同一个项目中。这是使用BDS 2006。
答案 0 :(得分:5)
您有一个循环引用,因为uGlobal
中的内容要使用uData
中的内容,反之亦然。循环引用是大型项目中的一个大问题,因为它们大大增加了复杂性 - 如果你有循环依赖,它就变得更像一个BIGGER单元。我怀疑在您的项目被认为是大型项目之前还有很长的路要走,更不用说“大规模”了。 ;)
您有两种可能的解决方案:
David已经给出了答案:至少有一个单位必须使用实施部分中的另一个。
uData interface
中声明了一个类型并在uGlobal interface
中引用了该类型,然后uGlobal
的界面需要 uData
,并且需要相应的使用条款。uData implementation
中的某个类型在uGlobal
的任何地方引用,则uData implementation
中的该声明必须移至界面部分。uGlobal interface
中有一个类型,它必须仅从uData
的实现部分引用,那么在实现部分中使用该子句就可以了。删除循环依赖关系需要将单位分解为更易于管理的较小单位。要执行此操作,您必须了解应用程序中每个事物之间的 依赖关系 。 例如:
uGlobal
声明A和C uData
声明B需要C 在这种情况下你要做的就是在那里的C处宣布一个新单位。
uGlobal
和uData
都会使用uNewUnit
我不以任何方式提倡你与uGlobal的方法。事实上,这是一个非常糟糕的主意,当你的项目开始变大时,你会在2个方面咬住大量的时间。不幸的是,这个解释本身就是一个巨大的答案。
答案 1 :(得分:4)
使用第二个“使用”,即“实施”部分中的“使用”
unit uData;
uses SysUtils, etc;
type
etc;
implementation
uses uGlobal;
// here you can reference things in uGlobal
答案 2 :(得分:2)
一般来说,David Zimmerman的答案是要走的路,但在你的情况下(根据你对David回答的回答),你需要在uGlobal单元的接口部分中使用TMyType;因此,将uData添加到实现部分的uses子句将无济于事。
似乎是重构的时候了;你应该考虑将TMyType或Stuff移动到第三个单元,这样uData和uGlobal都可以引用它。