为什么即使我为所有单元提供了记录定义,也会出现"不兼容类型"错误?

use*_*073 5 delphi record include type-declaration

我正在编写一个Delphi 2010应用程序.它有许多文件,其中两个称为Utils_ABS和Utils_MAT.我创建了一个两个文件都需要理解的记录类型,所以我将它放在自己的文件中,名为TypeDefs.inc.

在Utils_MAT和Utils_ABS的顶部,我已经包含了TypeDefs.inc.

unit Utils_ABS;

interface

{$WARNINGS ON}
{$HINTS ON}
{$WARN UNIT_PLATFORM OFF}
{$WARN SYMBOL_PLATFORM OFF}

uses
Windows, Messages, ... Utils, Analysis, UserFeedback, Utils_MAT;

{$I TypeDefs.inc}     // Include TypeDefs that are used multiple places

procedure ABS_Load;
...
Run Code Online (Sandbox Code Playgroud)

Utils_MAT看起来非常相似,特别是与之相关{$I TypeDefs.inc}.

关键项是两个文件引用第三个文件TypeDefs.inc作为INCLUDE,它具有RECORD的定义:

type
TTableAttrType = Record
tabIOT: Boolean; // Is table an IOT
...
end;
Run Code Online (Sandbox Code Playgroud)

除了这个文件中的这个记录定义之外别无其他.

问题是,当我编译时,我收到以下错误:

[DCC错误] Utils_ABS.pas(212):E2010不兼容的类型:'Utils_ABS.TTableAttrType'和'Utils_MAT.TTableAttrType'

我完全糊涂了.如果它们来自相同的定义,它们如何是不兼容的类型?不是定义的副本,而是字面上相同的定义.

我已检查了所有源代码,并且此TTableAttrType记录未在其他任何位置定义.

我试图注释掉$ INCLUDE,并将记录的定义硬编码到Utils_ABS和Utils_MAT中,但我仍然得到同样的错误.

如何让这个错误消失?如何在一个位置定义记录结构,并让多个文件访问它?

Mic*_*sen 11

通过包含这样的定义,您可以在两个单元中定义类型.由于Pascal(以及扩展名为Delphi)使用的是主格类型系统,而不是结构类型系统,因此两种类型不同 - 它们具有不同的名称,如错误消息中所示.

将TTableAttrType的定义放在一个单独的单元中,并将该新单元抛出到另外两个单元中接口部分的uses子句中.然后类型将只定义一次,并且您将不再具有不兼容的类型.