Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Inline function XXX has not been expanded because unit YYY is not specified in USES list / 3 сообщений из 3, страница 1 из 1
18.02.2020, 12:30
    #39927905
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Inline function XXX has not been expanded because unit YYY is not specified in USES list
Но не все так просто как написано в сабже.

Имеется Delphi XE и Delphi XE7. Имеется один и тот же тестовый код:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Contnrs;

var
  Lst: TObjectList;
  Obj: TObject;

begin
  try
    Obj := TObject.Create;
    Lst := TObjectList.Create(True);
    try
      Lst.Add(Obj);
      if Assigned(Lst.Items[0]) then
        Beep;
    finally
      Lst.Free;
    end;

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.



Мы знаем, что в обеих версиях дельфей TObjectList.GetItem объявлен как inline:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
unit System.Contnrs;

//...

  TObjectList = class(TList)
  private
    FOwnsObjects: Boolean;
  protected
    procedure Notify(Ptr: Pointer; Action: TListNotification); override;
    function GetItem(Index: Integer): TObject; inline;
    procedure SetItem(Index: Integer; AObject: TObject); inline;

//...

function TObjectList.GetItem(Index: Integer): TObject;
begin
  Result := inherited Items[Index];
end;



Я наблюдаю разное поведение у XE и XE7.

1) В Delphi XE данный код компилится без хинтов и ворнингов, и в отладчике видно, что вызов

Код: plaintext
if Assigned(Lst.Items[0]) then

развернут как инлайн (сразу вставлен код Result := inherited Items[Index] ):



2) В Delphi XE7 при компиляции получаем хинт

[dcc32 Hint] Project1.dpr(19): H2443 Inline function 'TObjectList.GetItem' has not been expanded because unit 'System.Classes' is not specified in USES list

и в отладчике видим что инлайн не развернут:



Разумеется, если в uses добавить System.Classes, то хинт пропадает, и вызов инлайнится как положено.

Но зачем, черт побери, в XE7 для этого требуется объявлять дополнительный юнит? Почему это работало в старой версии без дополнительного объявления?
...
Рейтинг: 0 / 0
18.02.2020, 12:31
    #39927906
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Inline function XXX has not been expanded because unit YYY is not specified in USES list
Если что, я пересобираю большой проект с XE на ХЕ7 и сталкиваюсь с такими граблями.
...
Рейтинг: 0 / 0
18.02.2020, 13:32
    #39927950
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Inline function XXX has not been expanded because unit YYY is not specified in USES list
Квейд,

Вообще, насколько я помню, это (подключение модулей из которых вызывается код в инлайновой процедуре) одно из правил использования inline. Исходя из этого, вопрос, скорее, почему в XE это было возможно?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Inline function XXX has not been expanded because unit YYY is not specified in USES list / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]