Delphi-Version: 10 Seattle
Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?
Ich bekomme bei folgendem
Delphi-Quellcode:
-Statement eine Warnung, dass eine Variable "möglicherweise" nicht initialisiert sein könnte:
case
Delphi-Quellcode:
Bei C++ ist der Compiler schlau genug:
type
TEnum = (a, b, c); var myEnum: TEnum; value: Byte; begin myEnum := TEnum.a; case myEnum of TEnum.a: value := 10; TEnum.b: value := 20; TEnum.c: value := 30; end; WriteLn(value); // W1036"might not have been initialized" // altough the case statement is exhaustive end.
Code:
Bei Sprachen wie Swift oder Rust bricht der Compiler mit einem Fehler ab, wenn ein match-Statement nicht vollständig ist.
enum Enum {a, b, c};
int main(int argc, char **argv) { Enum e = Enum::b; char c; switch (e) { case Enum::a: c = 1; break; case Enum::b: c = 2; break; case Enum::c: c = 3; break; } std::cout << c; return NO_ERROR; } Delphi bekommt von all dem aber nichts mit, und redet sich damit raus, dass es "möglicherweise" undefiniert sein könnte. Zumindest in 10.0 Seattle. Ist das in einer aktuellen Delphi-Version immer noch so? |
AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?
Jupp, denn Delphi weiß, dass in deinem Enum noch 253 weitere Werte sein können.
z.B.
Delphi-Quellcode:
myEnum := TEnum(123);
Sowas kannst du nur ausschließen, wenn bei Zuweisung an diese Variable der Wertebereich geprüft wird, und wenn man sämtliche Fehler ausschließen kann, z.B. böse Casts, fehlgeleitete Pointer, Buffer-Overflow, Häcker/Würmer/Viren, usw. |
AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?
Oder es heißt dass der Teil der die Fehlermeldungen generiert gar nichts mehr von Enums weiß, da er nur noch mit blanken Zahlentypen arbeitet.
Oh mann... 😕 |
AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?
Ich füge dem case oft noch ein else hinzu, wobei dann im Debug eine Exception ausgelöst wird und im Release passiert nichts.
Kommt später was zur Aufzählung hinzu, so erinnert mich die Exception dann, das noch was fehlt. |
AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?
Zitat:
|
AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?
Ich werfe die Exceptions immer, egal ob Debug oder Release.
Oder setze im Else die Variable auf NIL, was eh sein muß, weil ja sonst der Compiler von nicht-initialisierten Variablen schwafelt. Abgesehn da, wo eh immer nur ein Teil behandelt wird. |
AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?
Ich setze IMMER ein "else", weil man ja schnell mal einen Typen ergänzt und dabei ein case statement vergisst.
Das macht es dann "sichtbarer", fehlertolerant und die Fehlersuche ist dann viel leichter als wenn man sich auf Compiler-Automatismen verlassen würde. Deswegen finde ich das Warning auch gut und richtig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 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