Table of Contents

Verbesserung Kompiler

Informationen

  • Kategorien: Kernel | Klassenformeln
  • Version: 17.0.0.6237
  • Veröffentlichungsdatum: Freitag, 13. Juni 2014
  • Entwickler: Fischer
  • Benötigt Datenbankänderung: Nein
  • Betreff: Der Umgang mit Deskriptoren wurde verbessert und Fehler werden besser erkannt.

Beschreibung

Falls ein Argument einer (C++)Klassenformelfunktion vom Typ Deskriptor ist, werden jetzt folgende Fälle unterschieden:

  1. Der Wert kann Compilezeit ermittelt werden.

Der Compiler erkennt jetzt, wenn ein Argument-Wert zur Compilezeit bekannt ist und prüft, ob ein entsprechender Deskriptor existiert

SomeClassFunction( "Room" );	// Der Compiler weiß von der Funktion, dass das Argument vom Typ Klasse (Entity-Deskriptor) ist und kann prüfen.
				// Falls die Klasse Room nicht existiert, wird eine Warnung ausgegeben
  1. Der Wert kann nicht zur Laufzeit ermittelt werden (da das übergebene Argument eine Variable ist)

Hier wird angenommen, dass der Wert zur Laufzeit dynamisch ermittelt wird und zur Compilezeit definitiv nicht zur Verfügung steht. Eine Warnung wird deshalb nicht ausgegeben. Es liegt in der Verantwortung des Programmierers dafür zu sorgen, dass der Compiler möglichst "schlau" gemacht wird.

Beispiel: if ( Bedingung ) { $sClass = "Room"; // schlecht, der Compiler hat keine Ahnung dass es um einen Klassennamen geht $sClass = name_of( ::Room ); // gut, der Compiler kann prüfen } else { $sClass = GetClassnameFromFile(); // Der Wert ergibt sich erst zur Laufzeit. }

ClassFunction( $sClass ); // keine Warnung, es wird angenommen, dass der Wert wirklich erst zur Laufzeit bekannt ist
  1. Es wird ein Attribut übergeben

Der übergebene Wert (der Inhalt des Attributs) wird zur Laufzeit ermittelt. Hier besteht die Gefahr, dass etwas anderes gemeint war (dass der Name des Attributs übergeben würde). Eine potentiell gefährliche Situation, eine Warnung wird ausgegeben.

Beispiel: AttributeFunction( "Name" ); // ok, der Attributname wird zur Compilezeit geprüft AttributeFunction( descr_of(:Name) ); // ok, identische Situation wie bei "Name", aber unbedingt zu bevorzugen da expliziter formuliert AttributeFunction( :Name ); // gefährlich: hier wird nicht das Attribut :Name übergeben, sondern dessen Wert (Inhalt). // Ist der Inhalt des Attributs :Name z.B. "Otto Meier" wird zur Laufzeit ein Attribut mit dem Namen "Otto Meier" gesucht