Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Unbenutzte Improrts finden? (https://www.delphipraxis.net/149447-unbenutzte-improrts-finden.html)

ghost007 21. Mär 2010 19:20


Unbenutzte Improrts finden?
 
Der Titel sollte eigentlich schon alles sagen.
Ich würde aus den uses gerne alles rauswerfen, was ich nicht brauche. Gibt es da irgendeinen Trick?

daywalker9 21. Mär 2010 19:24

Re: Unbenutzte Improrts finden?
 
ICarus könnte dir helfen

mkinzler 21. Mär 2010 19:27

Re: Unbenutzte Improrts finden?
 
Das sollte eigentlich automatisch vom Linker entfernt werden

SubData 21. Mär 2010 19:35

Re: Unbenutzte Improrts finden?
 
Warum sollte der Linker das tun?

Sofern man eine Unit einbindet, die einen Initialization-Abschnitt hat, kann der Linker nicht entscheiden, ob die Unit wirklich nicht gebraucht wird, oder ob der Teil unter Initialization aus irgend einem Grund wichtig ist.

uligerhardt 21. Mär 2010 20:11

Re: Unbenutzte Improrts finden?
 
Auf StackOverflow findest du einiges zum Thema.

ghost007 21. Mär 2010 23:10

Re: Unbenutzte Improrts finden?
 
Danke, ICarus ist sehr gut, kann ich nur weiterempfehlen :)

himitsu 21. Mär 2010 23:39

Re: Unbenutzte Improrts finden?
 
PS: Nur weil eine Unit al "nicht genutzt" angezeigt wird, da nicht in dieser Unit "extern" aufgerufen wird, heißt es noch lange nicht, daß diese Unit wirklich nicht genutzt wird.

z.B. einige ShareMem-Units und die SysUtils sind solche Fälle, denn sie richten vorallem etwas ein, welches über Umwege genutzt wird.

Die SysUtils richtet z.B. eine "bessere"/schönere Exceptionbehandlung ein, welche dann über die System-Unit behandelt wird.

Delphi-Quellcode:
program Test;

var i: Integer;

begin
  i := 0;
  if 123 div i = 8 then ;
end.
Delphi-Quellcode:
program Test;

uses SysUtils;

var i: Integer;

begin
  i := 0;
  if 123 div i = 8 then ;
end.
So, wie man sieht, wird nichts direkt aus der SysUtils verwendet, welches wohl auch sowas wie ICarus anmerken sollte, aber dennoch kann es nötig/gewollt sein, daß diese Unit eingebunden ist.
Also ein bissl nachdenken und nicht gleich alles rauslöschen, welches angezeigt wird, sollte man schon.

mjustin 22. Mär 2010 05:47

Re: Unbenutzte Improrts finden?
 
Der Uses Cleaner Wizard aus den cnWizards ist direkt in die IDE integriert, und kann z.B. Units mit initialization automatisch ausfiltern.

himitsu 22. Mär 2010 11:48

Re: Unbenutzte Improrts finden?
 
Zitat:

Zitat von mjustin
Der Uses Cleaner Wizard aus den cnWizards ist direkt in die IDE integriert, und kann z.B. Units mit initialization automatisch ausfiltern.

Nja, es gibt auch Beispiele, wo soeine Unit dennoch nicht nötig ist.

Hier hat man z.B. einen Initialization-Block, aber ohne Verwendung von NutzeObjekt wäre das Objekt nicht nötig und die ganze Unit könnte entfallen.
Delphi-Quellcode:
unit MyUnit;

interface
  function NutzeObjekt: String;

implementation
  var Objekt: TStrings;

  function NutzeObjekt: String;
  begin
    Result := Objekt.Text;
  end;

  procedure ErstelleObjekt;
  begin
    Objekt := TStringList.Create;
    Objekt.Text := Irgendwas;
  end;

  procedure LöscheObjekt;
  begin
    Objekt.Free;
  end;

initialization
  ErstelleObjekt;

finalization
  LöscheObjekt;

end.
Bei sowas würde mir ein Sprachkonstrukt gefallen, wo man sagen könnte wann etwas einkompiliert(gelinkt werden soll.

z.B.:
Delphi-Quellcode:
initialization
  {$IFUSED 'NutzeObjekt'}
    ErstelleObjekt;
  {$ENDIF}

finalization
  {$IFUSED 'NutzeObjekt'}
    LöscheObjekt;
  {$ENDIF}

end.
Somit könnte der Compiler/Linker erkennen daß nichts in Initialization und Finalization gemacht wird und würde somit nicht einbinden müssen, bzw. nur eine leere Unit, welche er ja eh wegläßt.

uligerhardt 22. Mär 2010 12:41

Re: Unbenutzte Improrts finden?
 
Zitat:

Zitat von himitsu
Bei sowas würde mir ein Sprachkonstrukt gefallen, wo man sagen könnte wann etwas einkompiliert(gelinkt werden soll.

z.B.:
Delphi-Quellcode:
initialization
  {$IFUSED 'NutzeObjekt'}
    ErstelleObjekt;
  {$ENDIF}

finalization
  {$IFUSED 'NutzeObjekt'}
    LöscheObjekt;
  {$ENDIF}

end.
Somit könnte der Compiler/Linker erkennen daß nichts in Initialization und Finalization gemacht wird und würde somit nicht einbinden müssen, bzw. nur eine leere Unit, welche er ja eh wegläßt.

Schau mal hier. Vielleicht kann man damit was in der Richtung tricksen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz