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

Имеется 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
Inline function XXX has not been expanded because unit YYY is not specified in USES list
    #39927906
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если что, я пересобираю большой проект с XE на ХЕ7 и сталкиваюсь с такими граблями.
...
Рейтинг: 0 / 0
Inline function XXX has not been expanded because unit YYY is not specified in USES list
    #39927950
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

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


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