Warum muss eine procedure immer über der liegen (bzw. global deklariert werden) von der sie aufgerufen wird.
Müssen sie nicht
Wenn du die Funktionen als Methoden ordentlich in Klassen kapselst, dann ist die Reihenfolge egal.
Und man kann auch Forward-Deklarationen deklarieren. (implizit oder explizit)
Delphi-Quellcode:
// so wäre es eigentlich
type
TMyRecord = record
...
end;
PMyRecord = ^TMyRecord;
Delphi-Quellcode:
// das geht auch, da hier Delphi implizit das als Forward anerkennt, da es weiß, dass der Pointer immer genau 4/8 Bytes groß ist
type
PMyRecord = ^TMyRecord;
TMyRecord = record
...
FFriend: PMyRecord;
...
end;
Delphi-Quellcode:
type
TMyClass = class; // hier auch ... ein Pinter ist immer 4/8 Byte, drum kann man diesen Typ vorher in einer anderen Klasse, oder in der Klasse selber verwenden
...
TMyClass = class
...
end;
Delphi-Quellcode:
interface
procedure MyProc; // implizit / bei Klassen+Methoden das Selbe
implementation
procedure MyProc;
begin
...
end;
Delphi-Quellcode:
implementation
procedure MyProc; forward; // explizit
...
procedure MyProc;
begin
...
end;
[add]
https://en.wikipedia.org/wiki/One-pa...Pascal_Example
Ich hätte lieber das man proceduren und functionen auch recursive in den Units finden könnte.
Geht auch, aber bevor man seine Units kreuzverlinkt, sollte man sich besser überlegen, ob man da nicht ein Designproblem hat.
Sollte doch eigentlich egal sein ob drüber oder drunter solange wie sich diese in der gleichen
Unit befindet.
Weil der Compiler/Parser zu dem Zeitpunkt noch nicht weiß was und ob es das später mal gibt und wie es deklariert ist, wenn dessen Deklaration erst später kommt?
Single-Pass-Compiler /
One-Pass-Compiler gegen
Multi-Pass-Compiler
Delphi
ist war deswegen so ein schneller Compiler, weil es nur
einmal über den Code läuft und nicht versucht in mehreren Durchgängen alles zu vermanschen und gegenzuprüfen.
Seit LLVM ist das ein "war einmal".