Forward Deklaration von record wie bei class

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

Re: Forward Deklaration von record wie bei class

Beitrag von Mathias »

Aber ein Zeiger auf ein record wird explizit deklariert. Eine Variable vom Typ TObject oder einer Kindklasse ist jedoch immer ein Zeiger, dadurch kann der Compiler ohne große Probleme Vorwärtsdeklarationen dafür zulassen. Für record-Typen eben nur für 'ne Zeigervariable.
Dan wird es mit den klassischen object das gleiche Problem wie mit record sein, das man dies auch statisch oder dynamisch verwenden kann ?
Und die class geht nur dynamisch ?

Da scheint der C Compiler weniger heikel zu sein, da kann man struct forward deklarieren.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1758
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Forward Deklaration von record wie bei class

Beitrag von fliegermichl »

Mathias hat geschrieben: Fr 6. Mär 2026, 17:10 ...
Da scheint der C Compiler weniger heikel zu sein, da kann man struct forward deklarieren.
Der C Compiler ist ein Mehrpasscompiler und kann die Größen der verwendeten Strukturen im ersten Durchlauf ermitteln.
Der Pascalcompiler muß das alles beim (einzigen) ersten Lauf rauskriegen.

Das geht zwar schnell, hat aber auch einige Nachteile, wie man das hier z.B. sehen kann.
So würde ich mir auch wünschen, daß man Klassen als "external" definieren könnte und somit jede Klasse in einer eigenen Unit unterbringen könnte und dennoch darauf referenzieren.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Forward Deklaration von record wie bei class

Beitrag von af0815 »

fliegermichl hat geschrieben: Sa 7. Mär 2026, 07:58 So würde ich mir auch wünschen, daß man Klassen als "external" definieren könnte und somit jede Klasse in einer eigenen Unit unterbringen könnte und dennoch darauf referenzieren.
Ich würde mir mal ein neues Release vom "Featuritis Pascal Compiler" wünschen. Zumindest mal die Absicht dahinter - aber ohne Release Manager (bzw. Management) wird das nichts werden, was schnell geht.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

PascalDragon
Beiträge: 1034
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: Forward Deklaration von record wie bei class

Beitrag von PascalDragon »

Mathias hat geschrieben: Fr 6. Mär 2026, 17:10
Aber ein Zeiger auf ein record wird explizit deklariert. Eine Variable vom Typ TObject oder einer Kindklasse ist jedoch immer ein Zeiger, dadurch kann der Compiler ohne große Probleme Vorwärtsdeklarationen dafür zulassen. Für record-Typen eben nur für 'ne Zeigervariable.
Dan wird es mit den klassischen object das gleiche Problem wie mit record sein, das man dies auch statisch oder dynamisch verwenden kann ?
Und die class geht nur dynamisch ?
Korrekt.
Mathias hat geschrieben: Fr 6. Mär 2026, 17:10 Da scheint der C Compiler weniger heikel zu sein, da kann man struct forward deklarieren.
C-Compiler lassen es jedoch nicht zu ein vorwärtsdeklarierties struct (oder class im Fall von C++) in einem Kontext zu nutzen, in dem weiter Details wie die Größe bekannt sein müssen. Das hier scheitert zum Beispiel:

Code: Alles auswählen

struct test;

struct blubb
{
        struct test t;
};

struct test
{
        int c;
};

int main()
{
}
Der Code kompiliert jedoch wenn t als struct test* deklariert ist. Das ist letztlich das gleiche Verhalten wie in FPC.
fliegermichl hat geschrieben: Sa 7. Mär 2026, 07:58 Das geht zwar schnell, hat aber auch einige Nachteile, wie man das hier z.B. sehen kann.
So würde ich mir auch wünschen, daß man Klassen als "external" definieren könnte und somit jede Klasse in einer eigenen Unit unterbringen könnte und dennoch darauf referenzieren.
Für das JVM Target unterstützt FPC das für Java Klassen. Ich habe in dem Zuge auch mal versucht das allgemein zu implementieren, bin dann jedoch auf Probleme gestoßen, die ich zumindest damals (vor mehr als 10 Jahren) nicht lösen konnte.
FPC Compiler Entwickler

Antworten