#include von Bibliotehken



  • Hallo,

    mein Projekt hat nun für mich schon sehr große Formen angenommen, darum möchte ich mich mit dem einbinden von Header absichern.

    Ich habe mehrerer *.c *.h Programm/Headerdateien die ich miteinander verlinke.
    In fast jedem "Modul" brauche ich
    z.B.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    d.h egal wie oft ich die Dateien einbinde, sie werden nur geladen, wenn nicht schon geladen (kein unnötiger Speicherverbrauch) ?? , oder muss ich jede
    irgendwie mit #ifdev vorher abfragen.
    Also, mein Programm läuft super, ich möchte mich hier nur absichern bzw. wenn nötig mein Programm optimieren. 🙂

    Gruß
    worst_case



  • Bei den mir bekannte Compilern kann man die Header einfach lesen 😕
    Einfach mal bei dir mit einem Editor bei dir schauen was drinsteht 😕

    Es gibt auch andere Ansätze: Bei C-Quellext würde ich alles weglassen, was nicht der Funktion des Programms dient oder die Lesbarkeit des Quelltextes erschwert.

    MfG f.-th.



  • f.-th. schrieb:

    Bei den mir bekannte Compilern kann man die Header einfach lesen 😕
    Einfach mal bei dir mit einem Editor bei dir schauen was drinsteht 😕

    Es gibt auch andere Ansätze: Bei C-Quellext würde ich alles weglassen, was nicht der Funktion des Programms dient oder die Lesbarkeit des Quelltextes erschwert.

    MfG f.-th.

    Hallo,

    😕

    Meine Frage war/ist wenn in mehreren Programmmodulen, die ich beim compilieren verlinke... also zu einem Programm erstelle, die selben Biblioteken mit #include mehrmals deklariert werden, diese Bibliotheken dann einmal geladen werden, oder mehrmals im Speicher stehen ??
    Sorry wenn ich mich nicht verständlich ausgedrückt habe 😃

    Gruß
    worst_case



  • Mit #include werden keine Biliotheken eingebunden.
    Das sind Headerdateien mit Deklarationen von Funktionen und Variablen und Makrodefinitionen.

    Da das ganze aber Textersatz ist (die Headerdatei wird an der Stelle wo das include steht in die .c Datei eingefügt) gilt das nur für das jeweilige Modul.

    Die Bibliotheken werden vom Linker eingebunden. Und der weiß was er schon eingebunden hat und einmal reicht.



  • Sorry hatte nur

    #ifdev
    

    als vorrangiges Stichwort betrachtet.
    Aus welcher Sprache kommt das?



  • DirkB schrieb:

    Mit #include werden keine Biliotheken eingebunden.
    Das sind Headerdateien mit Deklarationen von Funktionen und Variablen und Makrodefinitionen.

    Da das ganze aber Textersatz ist (die Headerdatei wird an der Stelle wo das include steht in die .c Datei eingefügt) gilt das nur für das jeweilige Modul.

    Die Bibliotheken werden vom Linker eingebunden. Und der weiß was er schon eingebunden hat und einmal reicht.

    Hallo und vielen Dank für die schnelle Antwort.

    d.h.

    egal wie oft z.B. die

    #include <stdio.h>

    eingebunden wird, erkennt der Linker das er diese "Lib" nur einmal braucht ?

    #ifndef
    x.y
    #endif
    

    Bringt das etwas und wenn ja... wie ist die genaue Schreibweise ??

    Gruß
    worst_case



  • Das #include hat mit dem Linker nichts zu tun.
    Das #include ist eine Sache vom Präprozessor und dann vom Compiler.

    Der Compiler hinterläßt eine Information, dass er z.B. die Funktion printf() aufruft/benötigt.

    Der Linker baut aus diesen Informationen dann das Programm (die exe) zusammen.

    Selbst wenn du in deinem Programm 1000000 Mal printf nutz, ist es nur einmal eingebunden.

    Der Compiler erkennt auch, aob eine Funktion schon mal deklariert wurde und meckert auch, wenn die Deklarationen unterschiedlich sind.



  • DirkB schrieb:

    Selbst wenn du in deinem Programm 1000000 Mal printf nutz, ist es nur einmal eingebunden.

    Hallo.... nur um sicher zu gehen.

    datei1.c -> #include <stdio> print wird benutzt
    datei2.c -> #include <stdio> z.B. keine Funktion von <stdio> wird benutzt
    .......c -> #include <stdio> print wird benutzt
    datei9.c -> #include <stdio> print wird benutzt

    datei1-9.c werden zu einem Programm (exe) verlinkt.

    Die lib stdio wird nur einmal eingebunden, geladen in der exe ???

    gruß
    worst_case



  • Header enthalten normalerweise nur die Deklarationen und erst der Linker fügt die Bibliothek hinzu und er ist so schlau, dass er Funktionen nur einmal einbindet. Was anderes ist es bei inline Funktionen. Die können durchaus mehrfach angelegt werden (siehe unterschied zwischen inline, static inline und extern inline).



  • OK...

    Danke
    worst_case


Anmelden zum Antworten