Warning unreachable code

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Warning unreachable code

Beitrag von DL3AD »

Hallo,

bekomme bei dieser Codezeile die Meldung Warning unreachable code
DBlib ist als string definiert.

Code: Alles auswählen

 
    if exe = '.exe' then DBlib:= 'sqlite3.dll' else DBlib:= 'libsqlite3.so.0';
 

Was hat dass zu bedeuten ? :shock:

Gruß Frank

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Warning unreachable code

Beitrag von m.fuchs »

Mal davon ausgehend dass du exe wie in viewtopic.php?p=100343#p100343 definiert hast: Je nach Betriebssystem kann einer von beiden Zweigen deines if-Statements niemals aufgerufen werden. Deswegen gibt es diese Warnung.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Warning unreachable code

Beitrag von DL3AD »

... bedeutet aber dass die Codezeile so OK ist ?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Warning unreachable code

Beitrag von m.fuchs »

Ja, ist nur ein Hinweis darauf, dass du dir einen Teil des Codes sparen könntest. Wenn dich das (berechtigterweise) stört, dann solltest du die Library-Namen auch per ifdef festlegen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Warning unreachable code

Beitrag von Mathias »

dann solltest du die Library-Namen auch per ifdef festlegen.

Das sieht dann bei dir so aus:

Code: Alles auswählen

  {$IFDEF windows}
  DBlib:= 'sqlite3.dll';
  {$ENDIF}
  {$IFDEF Linux}
  DBlib:= 'libsqlite3.so.0';
  {$ENDIF}

Somit wird nur der Code welcher auch für das OS gebraucht wird mit kompiliert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Warning unreachable code

Beitrag von compmgmt »

DL3AD hat geschrieben:

Code: Alles auswählen

if exe = '.exe' then DBlib:= 'sqlite3.dll' else DBlib:= 'libsqlite3.so.0';

So etwas zu vergleichen um das aktuelle OS rauszubekommen ist nicht wirklich schön. Mach es lieber mit $ifdef, so wie Mathias es beschrieben hat. Solltest du es an mehreren Stellen brauchen, kannst du es natürlich genauso wie bei der exe machen:

Code: Alles auswählen

const
  Lib = {$ifndef mswindows} 'lib' {$else} '' {$endif};
  LibExt = {$ifdef mswindows}
      // Windows
      '.dll'
    {$else}
      {$ifdef darwin}
        // macOS (OS X, nicht MacOS Classic)
        '.dylib'
      {$else}
        // Alles andere (Linux, BSD, ...)
        '.so.0'
      {$endif}
    {$endif};
begin 
  ...
  if FileExists(Lib + 'sqlite3' + LibExt) then ...
  ...
end;

Wobei ich mir bei der Konstante "Lib" nicht ganz sicher bin, ob das richtig ist, da ich nicht weiß, ob man bei macOS überhaupt ein "lib" vor den Dateinamen setzt oder nicht.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Warning unreachable code

Beitrag von theo »

Es gibt die auch die betriebssystemabhängige Konstante SharedSuffix in dynlibs

http://wiki.freepascal.org/Lazarus/FPC_ ... ic_library
https://www.freepascal.org/docs-html/rt ... uffix.html

Antworten