C Grundlagen richtig verstehen ?
-
Hallo liebe Programmierer,
Ich bin in c soweit , dass Ich die Konzepte der prozduralen und ebenfalls objektorientierten Programmierung - verstehe - .
Beim ordnen des Wissens komme Ich jedoch auch auf die Frage zu erklären wie c von der Basis her aufgebaut wird.
Viele der Befehle, die man benutzt in C ( printf,strcmp,getchar u.s.w....)
sind ja keine Bestandteile des Compilers sondern laut Zitaten "in den Headern definiert". Ich habe, weil Ich einen tieferen Einblick in diese Stuktur bekommen
wollte im Linux Terminal z.B. die naheliegenste Header stdio.h einmal in einen Editor herauskopiert und grob durchgelesen:/* * ISO C99 Standard: 7.19 Input/output <stdio.h> */ #ifndef _STDIO_H #if !defined __need_FILE && !defined __need___FILE # define _STDIO_H 1 # include <features.h> __BEGIN_DECLS # define __need_size_t # define __need_NULL # include <stddef.h> # include <bits/types.h> # define __need_FILE # define __need___FILE #endif /* Don't need FILE. */ #if !defined __FILE_defined && defined __need_FILE /* Define outside of namespace so the C++ is happy. */ struct _IO_FILE; __BEGIN_NAMESPACE_STD /* The opaque type of streams. This is the definition used elsewhere. */ typedef struct _IO_FILE FILE; __END_NAMESPACE_STD #if defined __USE_LARGEFILE64 || defined __USE_SVID || defined __USE_POSIX \ || defined __USE_BSD || defined __USE_ISOC99 || defined __USE_XOPEN \ || defined __USE_POSIX2 __USING_NAMESPACE_STD(FILE) #endif # define __FILE_defined 1 #endif /* FILE not defined. */ #undef __need_FILE
Hier ein zweites Codebeispiel:
This function is a possible cancellation point and therefore not marked with __THROW. */ extern FILE *fopen (const char *__restrict __filename, const char *__restrict __modes) __wur; /* Open a file, replacing an existing stream with it. This function is a possible cancellation point and therefore not marked with __THROW. */ extern FILE *freopen (const char *__restrict __filename, const char *__restrict __modes, FILE *__restrict __stream) __wur; #else # ifdef __REDIRECT extern FILE *__REDIRECT (fopen, (const char *__restrict __filename, const char *__restrict __modes), fopen64) __wur; extern FILE *__REDIRECT (freopen, (const char *__restrict __filename, const char *__restrict __modes, FILE *__restrict __stream), freopen64) __wur; # else # define fopen fopen64 # define freopen freopen64 # endif #endif __END_NAMESPACE_STD #ifdef __USE_LARGEFILE64 extern FILE *fopen64 (const char *__restrict __filename, const char *__restrict __modes) __wur; extern FILE *freopen64 (const char *__restrict __filename, const char *__restrict __modes, FILE *__restrict __stream) __wur; #endif #ifdef __USE_POSIX /* Create a new stream that refers to an existing system file descriptor. */ extern FILE *fdopen (int __fd, const char *__modes) __THROW __wur; #endif
Dies sind nur 2 kurze zufällig gewählte Auszüge....
Nun stelle Ich fest : Dieser Code liest sich nicht einfach so ohne weiteres.
Einige der Schlüsslwörter kenne Ich, viele nicht.... ?
Suche Ich nach der Funktion printf, finde Ich Definitionsansätze in dem Header,kann die Funktionsweise aber nicht ohne weiteres verstehen ?Ich bin vorerst zu dem Schluss gekommen, da in diesem Standard - Header 2 weitere Header includiert sind:
# define __need_size_t # define __need_NULL # include <stddef.h> # include <bits/types.h> # define __need_FILE # define __need___FILE #endif /* Don't need FILE. */
ist die Grundlage der Sprache in einem Netzwerk von mehreren Headern, welche
in Linux in der Regel
in :
cd /
cd usr/
cd include/
liegen
(da sind fast ca. 100 Header abgespeichert), implementiert.
D.H. Die C- Sprache baut auf diesen Headern auf ? In was sind dann die Header geschrieben, in C können Sie nicht zu 100 % geschrieben sein, da Sie ja einen
Teil der Sprache erst erzeugen ? - ?Es offensichtlich ist kein Assembler ?
Desweiteren halte Ich es für sinnvoll, wenn man eine gute Grundlage in C erlangen möchte:
--- wenigstens zur Übung diese stdio.h der ersten C Version mal grob zu verstehen---
und wie es dazu kommt, dass eben viele Funktionen mit Hilfe dieses Headers Ihre Aufträge erledigen.Was ist hierbei,mit den Schlüsselwörtern wie :
Schleifen/Bedingungen: if, for , while
Datentypen: int , double , struct ,....Diese sind/müssten, wenn Ich das richtig einschätze in den Compilerbibliotheken und nicht in den Headern definiert werden.
Wie geht man vor, wenn man grob diesen Header verstehen will ?
-
softpad schrieb:
Hallo liebe Programmierer,
Ich bin in c soweit , dass Ich die Konzepte der prozduralen und ebenfalls objektorientierten Programmierung - verstehe - ?Ist das eine Frage?
Beim ordnen des Wissens komme Ich jedoch auch auf die Frage zu erklären wie c von der Basis her aufgebaut wird.
Viele der Befehle, die man benutzt in C ( printf,strcmp,getchar u.s.w....)
sind ja keine Bestandteile des Compilers sondern laut Zitaten "in den Headern definiert".Unsinn. Makros wie getchar sind in Headern definiert, Funktionen wie printf nicht. Überhaupt sind Funktionen eher selten in Headern definiert. Solange dir sowas nicht klar ist, brauchst du gar nicht anfangen, in den Bibliotheken des Compilers rumzuforschen.
Ich habe, weil Ich einen tieferen Einblick in diese Stuktur bekommen
wollte im Linux Terminal z.B. die naheliegenste Header stdio.h einmal in einen Editor herauskopiert und grob durchgelesen:Lass den ersten Eindruck auf dich wirken und mach dann wieder was anderes, produktives.
Ich bin vorerst zu dem Schluss gekommen, da in diesem Standard - Header 2 weitere Header includiert sind:
Das ist kein Schluss, sondern eine triviale Beobachtung.
D.H. Die C- Sprache baut auf diesen Headern auf ?
Nein.
In was sind dann die Header geschrieben, in C können Sie nicht zu 100 % geschrieben sein, da Sie ja einen
Teil der Sprache erst erzeugen ? - ?Die Header erzeugen keine Sprache. Demzufolge können die Header sehr wohl in C geschrieben sein. Müssen sie nicht unbedingt: Das hängt davon ab, wie sehr sie in an den jeweiligen Compiler gekoppelt sind. Theoretisch müssen die Header nichtmal als C-ähnlicher Code, nichtmal als Datei vorliegen, aber aus praktischen Gründen ist es dann halt doch in der Regel mehr oder weniger portabler, mit haufenweise Makros durchsetzter C-Code.
Desweiteren halte Ich es für sinnvoll, wenn man eine gute Grundlage in C erlangen möchte:
--- wenigstens zur Übung diese stdio.h der ersten C Version mal grob zu verstehen---
und wie es dazu kommt, dass eben viele Funktionen mit Hilfe dieses Headers Ihre Aufträge erledigen.Ich nicht. Das ist für eine "gute Grundlage" irrelevant bis schädlich, da du die Gründe für viele Designentscheidungen in Standardheadern nicht nachvollziehen kannst. Konkretes Beispiel: Unterstriche an Bezeichnern. Wie kommt jemand auf die Idee, bei seinen eigenen Headern
#ifdef _MYHEADER_H
zu schreiben? Natürlich, weil er das in der Standardbibliothek so gesehen hat, ohne zu verstehen was daran problematisch ist und warum die Standardbibliothek sich das im Gegensatz zu ihm erlauben darf.
Was ist hierbei,mit den Schlüsselwörtern wie
Schleifen/Bedingungen: if, for , while
Datentypen: int , double , struct ,....Diese sind/müssten, wenn Ich das richtig einschätze in den Compilerbibliotheken und nicht in den Headern definiert werden.
Ja, wenn wir mal "Compilerbibliothek" als einen nicht weiter definierten nebulösen Begriff annehmen. Wenn dich sowas interessiert, musst du dich mal mit Compilerbau auseinandersetzen. Aber das ist nicht notwendig, nur um programmieren zu können.
-
Danke für die Hinweise!
Wenn printf nicht in dem Header definiert ist, wo denn. Es ist doch eine Funktion ? Man schreibt doch selber auch Funktionen der Form xyz(); z.B..
in der Compilerbibliothek?
Aber was machen die Header denn dann, also getchar ist ein Makro und in dem Header
programmiert, Ich meine Ich will nicht alle Header beherschen um Gottes Willen,
aber z.B. verstehen welche Teile dort wie programmiert sind. Also z.B. das von dir als Beispiel angeführte Makro getchar würde mir schon reichen.Die letzte Anmerkung ist mir auch klar. Compilerbau ist eine - andere Disziplin,- zu der die Trennlinie der Compiler ist und der Aufwand ist dafür zu groß.
-
softpad schrieb:
Danke für die Hinweise!
Wenn printf nicht in dem Header definiert ist, wo denn. Es ist doch eine Funktion ? Man schreibt doch selber auch Funktionen der Form xyz(); z.B..
Wo irgendeine Standardfunktion definiert ist, kann dir wurscht sein. Du musst nur wissen, in welchem Header sie deklariert wird. Dabei Hilft eine Referenz.
-
deklariert ist Sie dann offensichtlich in stdio.h ....
Ich habe mir die gnu-c-manual.pdf mal heruntergeladen und lese mir das ganze mal durch.
Danke der Tipp war hilfreich.
-
Toll. Wo ist nun eigentlich dein Problem beim Aufrufen dieser Funktionen?
-
Da gibt es kein Problem, Ich versuche nur grob zu verstehen, was die Header alles bewirken. Programmieren kann Ich ....
-
Deklariert sind Funktionien, Variablen, Konstanten in den Headern der C-Standardbibliothek. Die jeweiligen Definitionen stecken in der Bibliothek selbst.
-
softpad schrieb:
Wenn printf nicht in dem Header definiert ist, wo denn.
In einer Bibliothek, die einen Namen wie libc oder msvcrt trägt. Wenn dir der Quellcode davon vorliegt, kannst du dir die Definition angucken (aber du wirst sie noch weniger verstehen als die Deklaration.)
Es ist doch eine Funktion ? Man schreibt doch selber auch Funktionen der Form xyz();
Tut man das? Für mich sieht das wie ein Funktionsaufruf aus. Aber mal angenommen es ist eine Definition, dann schreibst du die auch nicht in einen Header, sondern in ein C-File. (Ausnahme: inline)
Aber was machen die Header denn dann, also getchar ist ein Makro und in dem Header
programmiert, Ich meine Ich will nicht alle Header beherschen um Gottes Willen,
aber z.B. verstehen welche Teile dort wie programmiert sind. Also z.B. das von dir als Beispiel angeführte Makro getchar würde mir schon reichen.Sorry, ich hab mich geirrt, getchar ist eine Funktion. getc ist ein Makro, und sieht z.B. so aus:
#define getc(_fp) _IO_getc (_fp)
Toll, was? Einfach nur eine Weiterleitung an eine Funktion.
-
Danke!
(richtig : printf(); ist z.B ein Funktionsaufruf)
-
wtf? was weißt du jetzt mehr als vorher?