AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen FreePascal Include-Dateien richtig verwenden?
Thema durchsuchen
Ansicht
Themen-Optionen

Include-Dateien richtig verwenden?

Ein Thema von DualCoreCpu · begonnen am 16. Okt 2015 · letzter Beitrag vom 17. Okt 2015
Antwort Antwort
DualCoreCpu
(Gast)

n/a Beiträge
 
#1

Include-Dateien richtig verwenden?

  Alt 16. Okt 2015, 19:27
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?
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Include-Dateien richtig verwenden?

  Alt 16. Okt 2015, 19:55
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....
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#3

AW: Include-Dateien richtig verwenden?

  Alt 16. Okt 2015, 20:48
@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.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#4

AW: Include-Dateien richtig verwenden?

  Alt 16. Okt 2015, 21:10
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?
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#5

AW: Include-Dateien richtig verwenden?

  Alt 17. Okt 2015, 08:56
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.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#6

AW: Include-Dateien richtig verwenden?

  Alt 17. Okt 2015, 12:01
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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Include-Dateien richtig verwenden?

  Alt 17. Okt 2015, 12:27
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
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#8

AW: Include-Dateien richtig verwenden?

  Alt 17. Okt 2015, 13:00
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}
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Include-Dateien richtig verwenden?

  Alt 17. Okt 2015, 14:17
Danke.. hätte ich auch selbst drauf kommen können
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:39 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