public ausserhalb von Klassen

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

public ausserhalb von Klassen

Beitrag von Mathias »

Ich habe gerade ein public ausserhalb einer Klasse entdeckt.
Für was kann man dies gebrauchen ?

Code: Alles auswählen

program Project1;
var
  test: integer; public; // ?
begin
  test:=123;
  WriteLn(test);
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Zvoni
Beiträge: 402
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: public ausserhalb von Classen

Beitrag von Zvoni »

So wie ich es verstanden habe (und dein Beispiel-Code ist dafür ungeeignet):
https://www.freepascal.org/docs-html/ref/refse22.html
Die Variable bekommt in Assembler denselben Namen wie in deinem Quellcode und wird für anderen Assembler-Code zugänglich.
Bin mir jetzt nur nicht sicher, ob case-sensitive oder nicht (das mit dem cvar)

Kann mich aber auch irren...
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1630
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: public ausserhalb von Classen

Beitrag von corpsman »

Ich kenne das public auch noch, wenn man funktionen für den Linker eindeutig machen will, ebenfalls zur C Kompatibilität..

Code: Alles auswählen

Procedure __assert_func(bool: cbool); cdecl public name{$IFDEF CPU64} '__assert_func'{$ELSE} '___assert_func'{$ENDIF};
Begin
  Raise Exception.create('C-Assert failed');
End; 
--
Just try it

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

Re: public ausserhalb von Classen

Beitrag von Mathias »

Zvoni hat geschrieben: Mi 7. Aug 2024, 15:02 So wie ich es verstanden habe (und dein Beispiel-Code ist dafür ungeeignet):
https://www.freepascal.org/docs-html/ref/refse22.html
Die Variable bekommt in Assembler denselben Namen wie in deinem Quellcode und wird für anderen Assembler-Code zugänglich.
Bin mir jetzt nur nicht sicher, ob case-sensitive oder nicht (das mit dem cvar)

Kann mich aber auch irren...
Wen ich das richtig lese, es es public das Gegenstück von external.
Was mich dabei aber verwundert, wieso generiert die h2pas sowas ?
Müsste dies nicht external anstelle von public nehmen ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 963
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: public ausserhalb von Classen

Beitrag von PascalDragon »

Mathias hat geschrieben: Do 8. Aug 2024, 16:31 Was mich dabei aber verwundert, wieso generiert die h2pas sowas ?
Wie schaut der entsprechende C-Code aus, der das generiert?
FPC Compiler Entwickler

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1630
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: public ausserhalb von Klassen

Beitrag von corpsman »

Wen ich das richtig lese, es es public das Gegenstück von external.
Ja so könnte man das durchaus sehen.
Mit dem von mir gezeigten code ist der C-Code in der Lage direkt eine FPC funktion auf zu rufen, die nur via .h file bekannt gemacht wurde.
--
Just try it

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

Re: public ausserhalb von Klassen

Beitrag von Mathias »

Wie schaut der entsprechende C-Code aus, der das generiert?

Code: Alles auswählen

 const guint glib_major_version;
 const guint glib_minor_version;
 const guint glib_micro_version;
 const guint glib_interface_age;
 const guint glib_binary_age;

Code: Alles auswählen

  var
    glib_major_version : Tguint;cvar;public;
    glib_minor_version : Tguint;cvar;public;
    glib_micro_version : Tguint;cvar;public;
    glib_interface_age : Tguint;cvar;public;
    glib_binary_age : Tguint;cvar;public;    
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 963
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: public ausserhalb von Klassen

Beitrag von PascalDragon »

Mathias hat geschrieben: So 11. Aug 2024, 19:21
Wie schaut der entsprechende C-Code aus, der das generiert?

Code: Alles auswählen

 const guint glib_major_version;
 const guint glib_minor_version;
 const guint glib_micro_version;
 const guint glib_interface_age;
 const guint glib_binary_age;
Verständlich, dass h2pas, dann ein public draus macht, denn korrekterweise sollten externe Verweise in C ein extern haben, gcc und MSVC sind da aber etwas nachsichtig. clang zum Beispiel ist da um einiges weniger nachsichtig und wird das als Variablendeklaration ansehen, was dann entsprechend zu anderen Fehlern (spätestens zur Laufzeit) führen kann/wird.
FPC Compiler Entwickler

Antworten