mikrocontroller.net

Forum: Compiler & IDEs Wann #include *.c oder *.h?


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo @all

Mache gerade meine ersten Gehversuche mit dem AVR-GCC. Hab eine main.c
mit der main(). Diese ruft aus einer screen.c ne Funktion auf, die in
der screen.h deklariert ist. Ich verstehe nur nicht, warum ich in der
main.c die screen.c includieren muß und nicht wie z.B. bei MS-C++ die
screen.h? Funktionieren tut es. Grundsätzlich kann also nix falsch
sein. Im Grunde scheint es mir mit #include.c sogar logischer.
Vielleicht kann mich jemand aukfklären;-)

Vielen Dank!
Frank :-)

Autor: Leo Schroeder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in screen.h:
 void foo(void);

in screen.c:
 #include "screen.h"
 void foo()
 {
 }

in main.c:
 #include "screen.h"
 ...
 foo();

im Makefile:
 SRC += screen.c

"#include.c" ist nicht gut und auch nicht "logisch"

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man ein *.c includiert, muß man es vom Projekt ausschließen, da
sonst der Code zweimal erzeugt wird und dann der Linker meckert.

Daher macht man es nicht (ist aber nicht verboten).

Um nun die Variablen und Funktionen in einem anderen Objekt bekannt zu
machen includiert man dort also nur das *.h.


Peter

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Btw: in dem Fall wird in der screen.h keine Funktionsdeklaration
vorgenommen, sondern lediglich der Prototyp hinterlegt (damit der
Compiler weis, welche Parameter die Funktion erwartet).
Das "void" in einem Prototypen oder gar in der Funktionsdeklaration
wegzulassen ist "old-style", und sollte in C nicht mehr Praktiziert
werden.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
*.c, *.h sind aber nur Namen, Du könntest sie auch *.code und *.header
nennen.
Mußt dann bloß dem Compiler sagen, daß es C Sourcen sind (beim GCC:
-xc).


Peter

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@OldBug: doch doch, der Prototyp ist die Deklaration, und diese
gehört (für Funktionen, die in mehr als einer Quelle benutzt werden)
in eine Headerdatei.  Was dort nicht drinsteht ist die Definition
(mit einer Ausnahme: bei `inline' deklarierten Funktionen).

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähem, gut, merged into: /dev/brain :-)

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dankeschön!

Hab's angepasst & läuft.

Frank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.