$define / $macro on

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6952
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

$define / $macro on

Beitrag von Mathias »

Ich probiere gerde etwas mit $define

Code: Alles auswählen

{$macro on}
{$Define HelloWorld:=WriteLn('Hello World')}
{$Define Ausgabe(s):=WriteLn(s)}

program Project1;
begin
  HelloWorld;
  Ausgabe(s); // geht nicht
end.
HelloWorld geht. Aber bei Ausgabe scheitert er.
Gibt es überhaupt eine Möglichkeit eine Variable zu übergeben, so wie es bei C möglich ist ?
Zuletzt geändert von Mathias am Mi 11. Jun 2025, 15:31, insgesamt 1-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

charlytango
Beiträge: 1080
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: $Define

Beitrag von charlytango »

Ganz genau werden dir das sicher die Experten hier sagen, aber in meiner Welt klappt dein Beispiel nicht.

https://wiki.freepascal.org/Conditional_compilation/de

Code: Alles auswählen

{$macro on}
{$Define HelloWorld}
{$Define Ausgabe}

program Project1;
begin
  {$ifdef HelloWorld}
      WriteLn('Hello World')
  {$else}
       WriteLn('Ciao World')
  {$endif}
  
  {$ifdef Ausgabe}
    WriteLn('Ausgabe')
  {$endif}
  
end.
Aber ich vermute, dass es dabei noch einige Tricks gibt

Warf
Beiträge: 2139
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: $Define

Beitrag von Warf »

Mathias hat geschrieben: Sa 12. Okt 2024, 08:52 Gibt es überhaupt eine Möglichkeit eine Variable zu übergeben, so wie es bei C möglich ist ?
Nein genau das ist nicht möglich. Was ich schonmal behälfsmäßig gemacht habe war eine include datei zu schreiben, die dann defines nutzt. Also dann praktisch:

Code: Alles auswählen

{$Define Param1:=Foo}{$Define Param2:=Bar}{$I MyInclude.inc}
wobei dann die MyInclude.Inc z.B. sowas ist:

Code: Alles auswählen

WriteLn(Param1, Param2); {$Undef Param1}{$Undef Param2}
Für kleine Sachen macht das natürlich keinen Sinn, aber ich hatte es z.B. damals genutzt um für verschiedene Record typen die alle samt die selben Funktionen haben, die einmal zu schreiben und somit für jeden zu includen sodass man nur den Typnamen parametrisieren musste. Im Grund um damit Vererbung in Records zu simulieren

PascalDragon
Beiträge: 961
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: $Define

Beitrag von PascalDragon »

Mathias hat geschrieben: Sa 12. Okt 2024, 08:52 Gibt es überhaupt eine Möglichkeit eine Variable zu übergeben, so wie es bei C möglich ist ?
Nein. Und es ist auch nicht geplant.
FPC Compiler Entwickler

Mathias
Beiträge: 6952
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: $define / $macro on

Beitrag von Mathias »

Ich habe gerade eine Sinnvolle Anwendung mit {$MACRO ON} gemacht.

Für solche Fälle gibt es im Normalfall 2 Lösungen,
Entweder man schreibt den $include Block doppelt oder man lagert ihn in eine zusätzliche *.inc aus. so wie es bei glib2.pas der Fall ist.

Vorhin bin ich gerade auf eine 3. Lösung gekommen, ich schreibe den $include Block in ein Macro. So muss ich den Block auch nur einmal pflegen, wie bei einer zusätlichen *.inc.

Code: Alles auswählen

unit fp_chafa;

interface

uses
  fp_glib2;

{$IFDEF FPC}
{$PACKRECORDS C}
{$ENDIF}
{$MACRO ON}

{$DEFINE includes:=
  {$include chafa/chafa_common.inc}
  {$include chafa/chafa_version_macros.inc}
  {$include chafa/chafa_symbol_map.inc}
  {$include chafa/chafa_canvas_config.inc}
  {$include chafa/chafa_term_info.inc}
  {$include chafa/chafa_frame.inc}
  {$include chafa/chafa_image.inc}
  {$include chafa/chafa_placement.inc}
  {$include chafa/chafa_canvas.inc}
  {$include chafa/chafa_features.inc}
  {$include chafa/chafa_term_db.inc}
  {$include chafa/chafa_util.inc}
}


{$DEFINE read_interface}
includes
{$UNDEF read_interface}

implementation

{$DEFINE read_implementation}
includes
{$UNDEF read_implementation}

end.    
Spricht da was dagegen, wen man dafür ein Macro nimmt ?
Einzig was ich vorstellen kann, das es nicht mit Delphi geht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6952
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: $define / $macro on

Beitrag von Mathias »

Ein Nachteil hat das ganze, der Compiler läuft einwandfrei, aber die Lazarus-IDE findet die Deklarationen nicht mehr in den INC-Dateien, wen man sie mit der rechten Maustaste suchen will.
Vielleicht bin ich der erste, welcher dies ausprobierte, INC-Dateien in einem Macro zu bündeln.
Ach Ctrl-C geht nicht mehr, wen der Bezeichner in einer der INC-Dateien ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten