Forum: Compiler & IDEs includefile "vererben"


von Christian U. (z0m3ie)


Lesenswert?

Hallo,

ist es möglich ein includefile quasi zu vererben ?
Ich möchte der stdio.h der avr-libc eine funktion hinfügen, und dazu 
quasi ein kapselndes includefile erstellen das dann die original stdio.h 
einbindet nur seh ich da im moment keine Möglichkeit

von Marius W. (mw1987)


Lesenswert?

Mach doch einfach ein #include<stdio.h> in deine Header-Datei...

Dann hat deine Headerdatei die Daten von stdio.h und deine eigenen noch 
dazu...

MfG
Marius

von Marius W. (mw1987)


Lesenswert?

Hallo,

also ich würde das so machen, dass du einfach folgendes in deine 
Header-Datei reinschreibst:
1
#include<stdio.h>
Dann hast du automatisch alle Deklarationen aus stdio.h übernommen und 
kannst da dann deine eigenen Erweiterungen unterbringen.

MfG
Marius

von Christian U. (z0m3ie)


Lesenswert?

wie ich vermutet habe, funktioniert genau das leider nicht da das 
includefile damit auf sich selbst verweist. Ich konnts nur nicht 
beweisen bevor ichs probiert hab. Hat noch jemand eine andere Idee ?

von kosmonaut pirx (Gast)


Lesenswert?

hallo,
dann hast du einen fehler eingebaut. zeig mal dein beispiel bitte.
bye kosmo

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Was genau willst du denn damit anstellen?

Übrigens, #include "foo.h" wird zuert im aktuellen Verzeichnis
gesucht, #include <foo.h> dagegen nur in den Systemverzeichnissen.

Ich fände es aber hochgradig verwirrend, in einem Projekt ein
lokales "stdio.h" vorzufinden, das sich anders benimmt als das
System-<stdio.h>.

Was genau willst du eigentlich hinzufügen?

von Christian U. (z0m3ie)


Lesenswert?

Nein, ich möchte nicht das man sie mit "stdio.h" einbinden muss.
Ich möchte fopen hinzufügen.

@kosmonaut, was soll ich da bitte falsch gemacht haben ?
Es ist doch absoulut logisch das der compiler die stdio.h von mir 
einbindet.

In dem includefile steht drin

#ifndef _MY_STDIO_H
  #define _MY_STDIO_H

#include <stdio.h>

FILE* fopen(const char *filename, const char *mode);

#endif

von kosmonaut pirx (Gast)


Lesenswert?

hallo,

>>funktioniert genau das leider nicht da das
>>includefile damit auf sich selbst verweist

>#ifndef _MY_STDIO_H
>  #define _MY_STDIO_H

>#include <stdio.h>

>FILE* fopen(const char *filename, const char *mode);

>#endif

und wo verweist das include auf sicht selbst?
bye kosmo

von Christian U. (z0m3ie)


Lesenswert?

das includefile heisst stdio.h

von kosmonaut pirx (Gast)


Lesenswert?

hallo,
dann nenn es einfach um. an dieser stelle ist falscher stolz vollkommen 
unangebracht.
bye kosmo

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

_MY_STDIO_H steht dir übrigens nicht zu, das ist ein reservierter
Name.  Benenne deine eigenen Symbole besser ohne führenden Unterstrich.

Eine (hässliche) Variante wäre es übrigens noch, dass du im #include
in deiner Headerdatei einen absoluten Pfad angibst.  Für mein System
wäre das dann

#include </usr/local/avr/include/stdio.h>

von Christian U. (z0m3ie)


Lesenswert?

@kosmonaut

das hat doch nichts mit falschem stolz zu tun, entschuldige aber du 
versucht hier tips zu geben die ich einfach nicht gebrauchen kann. Du 
kennst den hintergrund überhaupt nicht und 3 posts lang hast du noch 
nichtmal meine beiträge gelesen. es stand nämlich schon im ersten das 
das ding stdio.h heisst.

weiterhin versuch ich eine unix compatible kapselung um FreeRTOS und die 
avr-libc zu basteln mit nem Treiber und Dateisystemlayer ich kann die 
stdio.h also nicht einfach umbenennen da es dann nicht mehr libc konform 
wäre.

@jörg
setzt aber vorraus das ich wissen muss wo die avr-libc installiert ist 
was bei mir allein schon 2 verschiedene locations sind (linux,windows) 
und real ist das bei mir _SDOS_STDIO_H das define gibt es garantiert 
nirgends

ich habs jetzt erstmal in ein anderes includefile mit hineingetan was eh 
immer eingebunden werden muss zufrieden bin ich mit der lösung nicht 
aber ...

von kosmonaut pirx (Gast)


Lesenswert?

hallo,

>das hat doch nichts mit falschem stolz zu tun, entschuldige aber du
>versucht hier tips zu geben die ich einfach nicht gebrauchen kann.

ok, lass ich's halt. ist wohl vergeudete zeit.

>Du
>kennst den hintergrund überhaupt nicht und 3 posts lang hast du noch
>nichtmal meine beiträge gelesen. es stand nämlich schon im ersten das
>das ding stdio.h heisst.

nun bleib bitte auf dem teppich. ich zitiere dich gerne:

>>Hallo,
>>ist es möglich ein includefile quasi zu vererben ?
>>Ich möchte der stdio.h der avr-libc eine funktion hinfügen, und dazu
>>quasi ein kapselndes includefile erstellen das dann die original stdio.h
>>einbindet nur seh ich da im moment keine Möglichkeit

wo, bitte schön, steht hier, dass deine datei stdio.h heißt? aber hilf 
mir doch mal auf die sprünge.

>weiterhin versuch ich eine unix compatible kapselung um FreeRTOS und die
>avr-libc zu basteln mit nem Treiber und Dateisystemlayer ich kann die
>stdio.h also nicht einfach umbenennen da es dann nicht mehr libc konform
>wäre.

wenn deine anforderungen so sind, dass deine datei so heissen muss, 
solltest du dann vielleicht auch in deinem post schreiben. häppchenweise 
informationen zu erfahren macht wirklich keinen spaß. und sich dann noch 
etwas anhören lassen zu müssen, nein danke.

dennoch viel erfolg,
bye kosmo

von Christian U. (z0m3ie)


Lesenswert?

>>>Hallo,
>>>ist es möglich ein includefile quasi zu vererben ?
>>>Ich möchte der stdio.h der avr-libc eine funktion hinfügen, und dazu
>>>quasi ein kapselndes includefile erstellen das dann die original stdio.h
>>>einbindet nur seh ich da im moment keine Möglichkeit

>wo, bitte schön, steht hier, dass deine datei stdio.h heißt? aber hilf
>mir doch mal auf die sprünge.

Entschuldige, ich dachte das kann man aus dem "vererben" und "zu stdio.h 
hinzufügen" ersehen. Ich war eigentlich der Meinung alle nötigen 
Informationen angegeben zu haben. Wenn dem nicht so ist bitte ich das zu 
entschuldigen, trotzallem hören sich Aussagen wie:

>hallo,
>dann nenn es einfach um. an dieser stelle ist falscher stolz vollkommen
>unangebracht.
>bye kosmo

nicht gerade nach "Ich hab zuwenig Information" an...

von Rolf Magnus (Gast)


Lesenswert?

> trotzallem hören sich Aussagen wie:
>
>>hallo,
>>dann nenn es einfach um. an dieser stelle ist falscher stolz vollkommen
>>unangebracht.
>>bye kosmo
>
> nicht gerade nach "Ich hab zuwenig Information" an...

Das kam aber erst, nachdem du explizit erwähnt hast, daß dein Header 
stdio.h heißt.

> Du kennst den hintergrund überhaupt nicht

Den kennt hier keiner, wenn du ihn uns nicht mitteilst. Die einfachste 
Lösung ist eben, der Headerdatei einen anderen Namen zu geben. Daß du 
einen Grund hast, genau das nicht zu tun, kann ja hier keiner auf 
magische Weise aus deinem Kopf lesen. Hättest du das gleich erwähnt, 
wäre die ganze Diskussion deutlich kürzer gewesen.

> setzt aber vorraus das ich wissen muss wo die avr-libc installiert ist
> was bei mir allein schon 2 verschiedene locations sind (linux,windows)

Du könntest das ja dynamisch beim Compilieren ermitteln lassen.

von Christian U. (z0m3ie)


Lesenswert?

>Du könntest das ja dynamisch beim Compilieren ermitteln lassen.

Es gibt ein define, das den Pfad zur avr-libc enthält ??

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Christian Ulrich wrote:

> setzt aber vorraus das ich wissen muss wo die avr-libc installiert ist

Ja.

Du kannst halt nicht alles auf einmal haben, es geht schlicht nicht.

> was bei mir allein schon 2 verschiedene locations sind (linux,windows)
> und real ist das bei mir _SDOS_STDIO_H das define gibt es garantiert
> nirgends

Das ist egal, ob es das schon irgendwo gibt oder nicht.  Diese Garantie
kannst du nicht erteilen.  Ein Präprozessormakro, dessen Name mit
einem Unterstrich, gefolgt von einem weiteren Unterstrich oder einem
Großbuchstaben beginnt, ist per Standard ``reserved for the
implementation'', d. h. es steht nur der Systembibliothek oder dem
Compiler zu (diese müssen sich gegenseitig irgendwie absprechen), ein
solches Symbol zu definieren/benutzen.

von Christian U. (z0m3ie)


Lesenswert?

In diesem Fall ist es ja aber eine Bibliothek und keine Anwendung.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Christian Ulrich wrote:

> In diesem Fall ist es ja aber eine Bibliothek und keine Anwendung.

Ja, und?  Warum kann man diese nicht mit einem Editor ändern?  Kannst
dir ja den Patch mittels diff -u aufheben, damit du ihn beim nächsten
Update einfach wieder einspielen kannst.

Wie geschrieben, du kannst nicht alles haben: sowohl zweimal den
gleichen Namen als auch keine üblen Hacks à la absoluter Pfadname
als auch die Rückführung auf die avr-libc-Dateien ohne duplizieren
von deren Inhalt.

Falls sich deine Bemerkungen auf die Bezeichner mit Unterstrich
bezog: ist egal.  Bibliotheken haben keine Sonderrechte, mit Ausnahme
der Systembibliothek (die der Standard gemeinsam mit dem eigentlichen
Compiler als ``the implementation'' bezeichnet).

von Christian U. (z0m3ie)


Lesenswert?

Es ist doch in diesem falle die Systembibliothek, ich stelle dort libc 
und unix funktionalität zur verfügung oder wo definierst du gehören 
fcntl.h, conio.h,unistd.h und ioctl.h funktionalitäten dazu ?
ich muss doch nur zusehn das meine Symbole in der avr-libc nicht 
vorkommen.

Und ist die avr-libc nicht mit dem Editor editierbar ? Das Argument 
versteh ich jetzt nicht.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Christian Ulrich wrote:

> Es ist doch in diesem falle die Systembibliothek, ich stelle dort libc
> und unix funktionalität zur verfügung oder wo definierst du gehören
> fcntl.h, conio.h,unistd.h und ioctl.h funktionalitäten dazu ?

conio.h?  MS-DOS. ;-)

> ich muss doch nur zusehn das meine Symbole in der avr-libc nicht
> vorkommen.

...und nicht vom Compiler benutzt werden.  Das solltest du mit den
,,Herstellern'' von Compiler und Bibliothek absprechen, ansonsten
kann es dir schnell mal passieren, dass Dinge, die heute noch
funktionieren, morgen nicht mehr gehen.

Die Diskussion in einem Webforum würde ich nicht als Absprache
bezeichnen... (zumal das ja eher zufällig mit hochkam dabei).

Aber du bist eben nicht die Systembibliothek, sonst hättest du
auch diesen Kuddelmuddel nicht.  Um das sinnvoll machen zu können,
müsstest du das gesamte stdio von avr-libc links liegen lassen und
komplett durch dein eigenes ersetzen.  Es hat doch sowieso keinen
Sinn, zwei grundverschiedene stdio-Systeme mischen zu wollen, das
funktioniert doch in der gesamten Bibliothek nicht.  Wenn du deine
eigene stdio-Implementierung hast, musst du halt dann (mittels -I-
Optionen) sicherstellen, dass die Nutzer sich die dazu passende
<stdio.h> includieren und natürlich auch, dass sie sich mit -l die
dazu gehörige Bibliothek auch linken.

von Christian U. (z0m3ie)


Lesenswert?

>conio.h?  MS-DOS. ;-)

hab noch gar nicht nachgeschaut gehabt, stimmt es gibt im unix ja gar 
keine Möglichkeit durch einen einfachen Funktionsaufruf den screen zu 
löschen o.ä. naja ioctl ist ja Erfahrungen und \33 auch :p.

momentan werd ich die avr-libc erstmal drin lassen vielleicht werden 
freertos und avr-libc irgendwann mal durch eigene Routinen ersetzt 
aktuell will ich erstmal ein möglichst einfaches und schlankes layer 
schaffen das es einem ermöglicht ab atmega16 unix like zu programmieren. 
Ich bin mir der gefahren mit den symbolen durchaus bewusst jedoch ist 
die Wahrscheinlichkeit das es da Probleme gibt doch äußerst gering.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Naja, du kannst doch den Rest der avr-libc drin lassen, aber was
brauchst du denn bei einer eigenen stdio-Implementierung wirklich
noch aus avr-libc's stdio.h?  Das würde doch schlimmstenfalls sogar
zum Crash führen.

von Christian U. (z0m3ie)


Lesenswert?

print
getc
putc
usw

ich übernehme ja quasi alles was aus der stdio.h kommt füge nur fopen 
hinzu so das man z.b.

fopen("/dev/tty0") benutzen kann.

eigentlich auch überflüssig da man eh über open,read,write,ioctl,close 
zugreifen sollte zum beispiel beim i2c treiber ist das wichtig da bei 
fopen nur getc und putc definiert werden und die avr-libc den rest macht 
wenn mann jetzt aber 2 byte vom i2c lesen oder schreiben will geht das 
natürlich nicht da die avr-libc das ganze in 2 zugriffe mittels getc 
teilt und der treiber dann nicht mehr weiss wann er ne start und stop 
condition zu senden hat.

vorerst ist aber die implementierung über die libc denk ich günstioger 
als alles wegzulassen und die ganzen print routinen werd ich wohl so 
schnell nicht implementieren.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Christian Ulrich wrote:

> *print*
> getc
> putc
> usw
>
> ich übernehme ja quasi alles was aus der stdio.h kommt füge nur fopen
> hinzu so das man z.b.
>
> fopen("/dev/tty0") benutzen kann.

Das kann doch aber nicht funktionieren.  Dein fopen() müsste ja dann
ein FILE * bereitstellen, mit dem die avr-libc-Funktionen wieder
was anfangen können.  Das bedeutet aber, dass du komplett mit den
Interna der avr-libc arbeiten musst.

Da du auf diese Weise versionsabhängig von der konkreten Implementierung
der avr-libc bist, kannst du die entsprechenden Deklarationen auch
gleich bei dir dupliziert mit aufnehmen.

> eigentlich auch überflüssig da man eh über open,read,write,ioctl,close
> zugreifen sollte

Dafür brauchst du aber kein fopen() sondern nur open().  Das hat dann
auch nichts mehr mit stdio zu tun.

von Christian U. (z0m3ie)


Lesenswert?

>Das kann doch aber nicht funktionieren.  Dein fopen() müsste ja dann
>ein FILE * bereitstellen, mit dem die avr-libc-Funktionen wieder
>was anfangen können.  Das bedeutet aber, dass du komplett mit den
>Interna der avr-libc arbeiten musst.

deswegen benutze ich fdevopen um die FILE Struktur zu befüllen.

>Dafür brauchst du aber kein fopen() sondern nur open().  Das hat dann
>auch nichts mehr mit stdio zu tun.

richtig, man kommt auch komplett ohne fopen,fread,fwrite ... aus aber 
ich hätte sie gern mit drin aus kompatibilitätsgründen.

genauso will ich fork und co aus der unistd implementieren aus 
kompatibilitätsgründen aber auch die wichtigsten funktionen aus der 
pthread lib bereitstellen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> deswegen benutze ich fdevopen um die FILE Struktur zu befüllen.

Hmm.  Dann bau lieber eine Erweiterung für die avr-libc, die offiziell
ins stdio mit rein kann, und die fopen() implementiert.  Diskutier
die Details auf der avr-libc-dev-Mailingliste.  fopen() sollte dann
implizieren, dass sein erstes Argument über open() auflösbar ist,
und bewirkt in der Folge, dass backend-Funktionen benutzt werden, die
ihrerseits read() und write() nutzen.  Die avr-libc muss dabei nicht
notwendigerweise selbst Implementierungen für open()/read()/write()
enthalten, sondern kann dies der Applikation überlassen.  (Ggf. hat
die avr-libc Dummies dafür.  Wenn deren open() für jedes Argument
ein -1 liefert, werden die anderen Funktionen ja nie angesprochen.)

Du wirst nicht um eine Integration herum kommen auf Dauer, da das
fclose() dahingehend erweitert werden müsste, dass es noch close()
ruft.

Auch wirst du perspektivisch eine Pufferung als Option haben wollen
(kann ja beim normalen fdevopen() ausgeschaltet bleiben), damit du
auch disk blocks bearbeiten kannst, d. h. read() und write() können
nur auf (Vielfachen von) 512-Byte-Blöcken arbeiten.

Wenn das alles ordentlich gemacht ist, könnte ich mir das sehr gut
als Erweiterung der avr-libc vorstellen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.