Compiler Hint: “Inline function '…' has not been expanded…”

后端 未结 4 1143
难免孤独
难免孤独 2021-02-19 05:06

In a unit I use the function DeleteFile and the compiler outputs a hint:

\"H2443 Inline function \'DeleteFile\' has not been expanded because

4条回答
  •  慢半拍i
    慢半拍i (楼主)
    2021-02-19 05:51

    I was also confused by this hint. Then i realized what the issue is. Your code:

    uses
       SysUtils;
    
    procedure TForm1.DoStuff;
    begin
       SysUtils.DeleteFile('foo');
    end;
    

    is literally being replaced with:

    uses
       SysUtils;
    
    procedure TForm1.DoStuff;
    var
      Flags, LastError: Cardinal;
    begin
      Result := Winapi.Windows.DeleteFile(PChar(FileName));
    
      if not Result then
      begin
        LastError := GetLastError;
        Flags := GetFileAttributes(PChar(FileName));
    
        if (Flags <> INVALID_FILE_ATTRIBUTES) and (faSymLink and Flags <> 0) and
          (faDirectory and Flags <> 0) then
        begin
          Result := RemoveDirectory(PChar(FileName));
          Exit;
        end;
    
        SetLastError(LastError);
      end;
    end;
    

    If you'll notice, your "new" code depends on WinApi.Windows unit:

    Result := Winapi.Windows.DeleteFile(PChar(FileName));
    

    which you didn't include in your uses clause.

    If you manually had inlined the code (copied and pasted), the code would simply not compile until you added Windows to your uses.

    Instead, the compiler will not do the inline because:

    Inline function 'DeleteFile' has not been expanded because unit 'Windows' is not specified in USES list"

提交回复
热议问题