Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   Include-Dateien richtig verwenden? (https://www.delphipraxis.net/186968-include-dateien-richtig-verwenden.html)

DualCoreCpu 16. Okt 2015 19:27

Include-Dateien richtig verwenden?
 
Hallo,

ich stehe vor folgendem Problem:

Ich habe mehrere Includedateien untereinander aufgeführt. Nun werden Bezeichner, die in einer vorangegangenen Iclude Datei definiert wurden in der darauf folgenden oder der übernächsten Include Datei nicht erkannt. Wenn ich diese Bezeichner aber redefiniere, erhalte ich nicht nur den Hiweis auf die Redefinition, sondern der Compiler bricht mit der Medung "Doppelter Bezeichner ab.

Wie also stelle ich sicher, das die in den Icludedateien definierten Bezeichener auch in nachfolgenden Include Dateien erkannt werden, natürlich ohne durch evtl. Verschachtelte Include Dateien wiederum doppelte Bezeichner zu erhalten?

Letzteres befürchte ich, wenn ich die fehlenden Bezeichner dadurch bekannt mache das ich in der betroffenen Include Datei dijenige mit den fraglichen Bezeichnern mit {$I meineinc.inc} einfüge.

Dann habe ich eine Verschachrtelung von Include Dateien, bei der ich noch größere Probleme befürchte.


Wie aber mache ich es richtig?

Lemmy 16. Okt 2015 19:55

AW: Include-Dateien richtig verwenden?
 
Warum willst du include-Dateien verwenden? Ich habe ein Projekt in dem der Programmierer vor mir davon exzessiv Gebrauch gemacht hat. Ich dreh ständig am Rad, da die einfachsten Dinge nicht funktionieren (springen von Deklaration zu Definition, ....)

IBObjects nutzt auch include-Dateien um insbesondere gemeinsam genutzte Teile in div. pas zu nutzen - Debuggen wird so zur Qual....

DualCoreCpu 16. Okt 2015 20:48

AW: Include-Dateien richtig verwenden?
 
@Lemmy:

mir geht es da genauso wir Dir.

Leider sind die fraglichen Includedateien nicht von mir, sondern in Freepascal eingebaut. Das Freepascalteam macht leider massiven Gebrauch davon.

Ich will nun einige der dort vorhandenen Definitionen in einem eigenen Programm verwenden und bin daher leider darauf angewiesen, diese Definitionen deren Anzahl recht umfangreich ist, zu verwenden.

Wenn ich diese Defs selber schreiben würde, würde ich das in einer Unit machen.

Aber wenn ich fertige Defs aus Freepascal Includedateien nehmen muss, geht das nicht, es sei denn ich kopiere sie alle in eine einzige neue Includedatei.

Wenn sich hier in der Diskussion keine andere Lösung ergibt, werd ich das so machen.

BadenPower 16. Okt 2015 21:10

AW: Include-Dateien richtig verwenden?
 
Du musst nicht die Include-Dateien in Deinen Quell-Code einbinden, sondern die Units, zu welchen die Include-Dateien gehören.

Um welche Definitionen geht es?

DualCoreCpu 17. Okt 2015 08:56

AW: Include-Dateien richtig verwenden?
 
Zitat:

Zitat von BadenPower (Beitrag 1318932)
Du musst nicht die Include-Dateien in Deinen Quell-Code einbinden, sondern die Units, zu welchen die Include-Dateien gehören.

Um welche Definitionen geht es?

Ich weiß leider nicht, wie ich mein Problem anschaulicher erklären kann. Habe deshalb für mein Programm eine andere Lösung benutzt.

Hier das Problem dennoch als Verständnisfrage:

Ich habe zum Beispiel diese Include Dateien in irgendeiner meiner units aufgeführt:

Delphi-Quellcode:
unit myUnit;

interface

uses
  Windows, Sysutils, Classes, ....;

{$i base.inc}     //Definitionen
{$i other.inc}
{$i further.inc}

implementation

{$i base.inc}     //wegen eventueller Implementationen
{$i other.inc}
{$i further.inc}

end.
Nun gebe es in base.inc Definitionen, die in weiteren Definitionen in other.inc und further.inc vorausgesetzt werden, sagen wir in nachfolgenden record Strukturen in denen solche in vorherigen Include Dateien definierten Typen für Datenfelder verwendet werden oder Konstantenwerte aus zb. base.inc in other.inc oder further.inc wieder benötigt werden, sei es für Rcordvarianten oder Zuweisung neuer Konstanten mit den Werten, die in einer der vorher aufgeführten Include Dateien definiert sind.

Der FPC Compiler findet einige der Definitionen nicht, wenn sie in nachfolgenden Include Dateien wieder benötigt werden.

Ich dachte, das es da eine Lösung geben sollte, da Freepascal zum Beispiel in der Unit Windows nur die Include Dateien mit allen Definitionen aufgeführt hat.

Warum funktioniert das mit den Standard Units von Freepascal nicht aber mit eigenen Units, in denen ich dieselbe Technik verwende.

Bitte diskutiert nicht über Sinn und Unsinn dieser Technik, die ja Freepascal auch verwendet, sondern nur über das Problem an sich, wraum das mit Freepascal geht, aber nicht, wenn ich das ebenfalls anwenden will.

Für mein Programm habe ich jetzt einfach eine große Unit mit allen benötigten Definitionen geschrieben und brauche daher keine Include Datei mehr.

Das Problem interessiert mich aber dennoch.

BadenPower 17. Okt 2015 12:01

AW: Include-Dateien richtig verwenden?
 
Zitat:

Zitat von DualCoreCpu (Beitrag 1318945)
Warum funktioniert das mit den Standard Units von Freepascal nicht aber mit eigenen Units, in denen ich dieselbe Technik verwende.

Du verwendest eben NICHT die gleiche Technik (siehe Beipiel oben), wie sie in den Freepascal Units verwendet wird.

Bei Deinem Beispiel fehlt zum Beispiel die Anweisung nur den Abschnitt zu laden, welcher in den einzelnen IFDEF-Abschnitten steht.

Die Freepascal-Include-Dateien sind jeweils in zwei Abschnitte unterteilt. Einmal zum Laden im Interface-Teil und einmal zum Laden im Implementationsteil. Und in den Units wird mit DEFINE geregelt was geladen werden soll.

Mach einmal ein komplettes Minimal-Beispiel mit einer Unit und 2 oder 3 Include-Dateien (mit 1-2 Typen und Funktionen), welches NICHT funktioniert und lade es hier hoch oder poste den gesamten Quelltext.

Lemmy 17. Okt 2015 12:27

AW: Include-Dateien richtig verwenden?
 
Zitat:

Zitat von BadenPower (Beitrag 1318949)
Du verwendest eben NICHT die gleiche Technik (siehe Beipiel oben), wie sie in den Freepascal Units verwendet wird.

Bei Deinem Beispiel fehlt zum Beispiel die Anweisung nur den Abschnitt zu laden, welcher in den einzelnen IFDEF-Abschnitten steht.

ich habe gerade kein Freepascal installiert: Könntest Du in ein paar Zeilen kurz zeigen, wie die Include-Dateien dort in Teilen geladen werden?

GRüße und Danke

BadenPower 17. Okt 2015 13:00

AW: Include-Dateien richtig verwenden?
 
Zitat:

Zitat von Lemmy (Beitrag 1318951)
ich habe gerade kein Freepascal installiert: Könntest Du in ein paar Zeilen kurz zeigen, wie die Include-Dateien dort in Teilen geladen werden?

Delphi-Quellcode:
unit windows;

{$PACKSET 1}

{$ifndef NO_SMART_LINK}
{$smartlink on}
{$endif}

{ stuff like array of const is used }
{$mode objfpc}
{$inline on}
{$calling stdcall}

interface

{$define read_interface}
{$undef read_implementation}

{$i base.inc}
{$i errors.inc}
{$i defines.inc}
{$i struct.inc}
{$i messages.inc}
{$i ascfun.inc}
{$i unifun.inc}
{$ifdef UNICODE}
{$i unidef.inc}
{$else not UNICODE}
{$i ascdef.inc}
{$endif UNICODE}
{$i func.inc}
{$i redef.inc}

implementation

{$undef read_interface}
{$define read_implementation}

{$i base.inc}
{$i errors.inc}
{$i defines.inc}
{$i struct.inc}
{$i messages.inc}
{$i ascfun.inc}
{$i unifun.inc}
{$ifdef UNICODE}
{$i unidef.inc}
{$else not UNICODE}
{$i ascdef.inc}
{$endif UNICODE}
{$i func.inc}
{$i redef.inc}

end.
man beachte die DEFINEs und UNDEFs im Interfaceteil der Unit:
Delphi-Quellcode:
{$define read_interface}
{$undef read_implementation}
und im Impelemtationteil der Unit:
Delphi-Quellcode:
{$undef read_interface}
{$define read_implementation}
Dazu noch ein Ausschnitt aus der base.inc:
Delphi-Quellcode:
{$ifdef read_interface}   
  type

  //...

    DWORD = cardinal;

  //..

  function GetBValue(rgb : longint) : BYTE; inline;
  //...
  function RGB(r,g,b : longint) : DWORD; inline;
  //...

{$endif read_interface}

{$ifdef read_implementation}

  function GetBValue(rgb : longint) : BYTE;
    begin
       GetBValue:=BYTE(rgb shr 16);
    end;

  //...

  function RGB(r,g,b : longint) : DWORD;
    begin
       RGB:=DWORD(((DWORD(BYTE(r))) or ((DWORD(WORD(g))) shl 8)) or ((DWORD(BYTE(b))) shl 16));
    end;
  //...

{$endif read_implementation}

Lemmy 17. Okt 2015 14:17

AW: Include-Dateien richtig verwenden?
 
Danke.. hätte ich auch selbst drauf kommen können ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz