Maik81SE hat geschrieben: Do 21. Jan 2021, 18:32
PascalDragon hat geschrieben: Do 21. Jan 2021, 09:12Außerdem kannst du Makros nicht über Unitgrenzen hinweg einsetzen.
und das könnte ggf in der weiteren Entwicklung des Programmes ein Problem werden.
Das ist nicht ganz exakt. Man kann die Macros in eine .inc Datei schreiben und diese dann in jeglicher unit einbinden.
Ich bastel da selber gerade an einem größeren Projekt und die Macros funktionieren nun sehr gut.
Die Macros sind in FPC leider nicht soweit entwickelt wie in c++ und man findet nur wenig Infos.
Es fehlt die Parameterisierung. Ich hatte mich ausgibig mit diesem Thema befassen müssen weil der Umfang im Projekt sonst riesig geworden wäre.
Dabei bezeihe ich mich auf identischen bzw. fast identischen Quellcode.
Ich habe nach sehr viel try-and-error einiges herausgefunden:
Socke hat geschrieben: Do 21. Jan 2021, 09:14
Die Makros in Pascal können nur einfache Textersetzung.
....
Im Prinzip ja, aber es werden mehrere Durchläufe ausgeführt, solange bis alle Macros aufgelöst sind,
und diesen Umstand habe ich mir zu nutzen gemacht um dennoch Parameter für den Quellcode zu nutzen.
(Oder man hätte einen anderen externen PreCompiler installieren müssen, was ich nicht wollte.)
Dabei ist es dann möglich in einer unit (wo die Macro.inc datei eingebunden ist) einen neuen "Parameter-Macro" zu definieren der dann in der .inc Datei angewendet wird.
In meinem Projekt müssen über 270 Elemente definiert werden.
Also hat man dann über 270 Klassen und man kann sich vorstellen wieviel Code das wird,
Für jede Klasse gibts einen constructor, destructor, ein weiteren constructor der gleich das element kopiert usw.
Im c++ code sind, dank des Macros, nur noch zwei Zeilen code nötig für das "anlegen" der Klasse.
Durch die Paramter, welche vorher duch ein Macro definiert werden, brauche ich 3 bis 6 Zeilen um eine Klasse mit all ihren methoden zu definieren.
Macros zu verwenden um reine Methoden damit zu ersetzen finde ich nicht so gut, da ist die "inline" Geschichte schon besser.
Wobei das "inline" oft nur bei methoden verwendet wird, die nur eine Zeile Code haben. Oder zumindestens nicht sehr viel.
Sollte natürlich die Methode welche man oft verwendet sehr komplex sein, macht ein "inline" vielleicht auch keinen Sinn mehr.
Und hier noch ein wenig Code:
das Basis Klassen Macro in der Macro.inc Datei
Code: Alles auswählen
(* EBML class head with context values *)
{$define DECLARE_EBML_CLASS_HEAD:=
public
constructor Create; override;
constructor Create(const ElementToClone: EBML_CLASS); --> EBML_CLASS ist der Parameter Macro
function CreateElement: TEbmlElement; override;
class function Get_Context: PEbmlContext; override; static;
function Clone: TEbmlElement; override;
}
und hier in einer unit
Code: Alles auswählen
{$i Macro.inc}
type
TEbmlVersion = class(TEbmlUInteger)
{$define EBML_CLASS:=TEbmlVersion} DECLARE_EBML_CLASS_HEAD
end;