Почему я получаю сообщение об ошибке «несовместимые типы», хотя определение записи доступно для всех устройств? - PullRequest
5 голосов
/ 23 октября 2011

Я пишу приложение Delphi 2010.В нем много файлов, два из которых называются Utils_ABS и Utils_MAT.Я создал тип записи, который нужно понимать обоим файлам, поэтому я поместил его в отдельный файл с именем TypeDefs.inc.

В верхней части Utils_MAT и Utils_ABS у меня есть INCLUDED 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;
...

Utils_MAT выглядит очень похоже, особенно в отношении {$I TypeDefs.inc}.

. Ключевым моментом является то, что оба файла ссылаются на третий файл, TypeDefs.inc, как INCLUDE, который имеетопределение ЗАПИСИ:

type
TTableAttrType = Record
tabIOT: Boolean; // Is table an IOT
...
end;

В этом файле нет ничего, кроме этого определения одной записи.

Проблема в том, что при компиляции я получаю следующую ошибку:

[Ошибка DCC] Utils_ABS.pas (212): E2010 Несовместимые типы: 'Utils_ABS.TTableAttrType' и 'Utils_MAT.TTableAttrType'

Я в замешательстве.Как они могут быть несовместимыми типами, если они происходят из одного и того же определения?Не копия определения, но буквально то же определение.

Я проверил весь свой исходный код, и эта запись TTableAttrType больше нигде не определена.

Я попытался закомментировать$ INCLUDE и жестко закодировать определение записи в Utils_ABS и Utils_MAT, но я все еще получаю ту же ошибку.

Как мне устранить эту ошибку?Как определить структуру записи в одном месте и получить доступ к нескольким файлам?

Ответы [ 2 ]

11 голосов
/ 23 октября 2011

Включая такое определение, вы определяете тип в обеих единицах. Поскольку Паскаль (и, соответственно, Delphi) использует систему именных типов , а не систему структурных типов 1004 *, эти два типа не совпадают - они имеют разные имена, как показано на сообщение об ошибке.

Поместите определение TTableAttrType в отдельный модуль и добавьте этот новый модуль в условие использования раздела интерфейса в двух других модулях. Тогда тип будет определен только один раз , и у вас больше не будет несовместимых типов.

1 голос
/ 24 октября 2011

Несмотря на то, что @ объяснение Майкла верно, есть кое-что важное, что нужно добавить к этому ответу.

Несмотря на то, что директива {$INCLUDE ...} и выражение Uses выглядят одинаково, они работают совершенно иначе. {$INCLUDE} импортирует источник (как в, читает из, а затем вставляет в) из указанной единицы в единицу вызывающей стороны, тогда как предложение Uses компилирует указанную единицу и затем использует скомпилированный двоичный файл (dcu). Поэтому, когда вы используете {$ INCLUDE}, вы на самом деле не разделяете одно и то же, а дублируете его. Не имеет значения, что их имена и структуры одинаковы, они совершенно разные сущности для компилятора. С другой стороны, когда вы используете скомпилированный объект, вы имеете в виду тот же общий объект.

...