Der Grund dafür ist ganz einfach typsicherheit. Beispiel, sagen wir mal ich habe eine C bibliothek die 2 structs benutzt, deren interne struktur mich aber in Pascal nicht interessiert da ich einfach nur den pointer davon bekomme und benutze:
Code: Alles auswählen
function GetStructA: Pointer; external 'MeineCBibliothek';
function GetStructB: Pointer; external 'MeineCBibliothek';
procedure DoSomethingWithStructA(StructA: Pointer); external 'MeineCBibliothek';
procedure DoSomethingWithStructB(StructB: Pointer); external 'MeineCBibliothek';
...
Das würde so kompilieren und funktionieren. Allerdings könnte ich dann das machen:
Das würde der Compiler Zulassen da DoSomethingWithStructB einen Pointer erwartet und GetStructA einen Pointer liefert. Allerdings würde das dann zu Fehlern in C führen, weil der eine StructB erwartet aber eine StructA bekommt.
Macht man das jetzt mit Dummy Typen sieht das so aus:
Code: Alles auswählen
type
PStructA = ^TStructA;
TStructA = record end;
PStructB = ^TStructB;
TStructB = record end;
function GetStructA: PStructA; external 'MeineCBibliothek';
function GetStructB: PStructB; external 'MeineCBibliothek';
procedure DoSomethingWithStructA(StructA: PStructA); external 'MeineCBibliothek';
procedure DoSomethingWithStructB(StructB: PStructB); external 'MeineCBibliothek';
Dann wirft der Code von obem
Den folgenden Fehler
Code: Alles auswählen
project1.lpr(23,36) Error: Incompatible type for arg no. 1: Got "PStructA", expected "PStructB"
Somit macht das zwar semantisch keinen unterschied, allerdings erlaubt es dem Compiler Fehler zu finden die sonst eventuell untergehen würden.
Dummy typen sind generell ein sehr mächtiges Werkzeug um dem Compiler die Möglichkeit zu geben Korrektheit zu checken, wollte dazu seit längerem schonmal was zu schreiben, denn das ist auch in reinem Pascal Code recht nützlich