Forum: Mikrocontroller und Digitale Elektronik Grundsätzliche Frage zu C (M16C)


von Martin2 (Gast)


Lesenswert?

Hallo,

ich habe mal eine sehr allgemeine Frage zu C. Was gehört in die *.c und 
was in die *.h Datei? Bzw. in welche Datei gehört

Variablen Deklaration
Constanten
Definition von Funktionen
Programmcode der Funktionen

Vielen Dank Martin

von Fabian K. (fabian_k)


Lesenswert?

Hallo,

Variablen Deklaration
  kommt darauf an wo man sie braucht (im Hauptprogramm, in der 
Funktion).
  Dort deklariert man sie dann.
Constanten
  Ich schreibe die Konstanten, die ich im Library (*.h-Datei) brauche 
ins Library (*.h-Datei) und die Konstanten, die ich im Hauptprogramm 
brauche ins Hauptprogramm (*.c-Datei). Man könnte auch alle ins 
Hauptprogramm schreiben, oder umgekehrt.
Definition von Funktionen
  Ins Library (*.h-Datei)
Programmcode der Funktionen
  Ins Library (*.h-Datei)

MfG
Fabian

von was?? (Gast)


Lesenswert?

Programmcode in die Header-Datei?? Eher nicht!

von Fabian K. (fabian_k)


Lesenswert?

Den Programmcode, der in der Funktion abgearbeitet wird, schon.

von Karl H. (kbuchegg)


Lesenswert?

> Den Programmcode, der in der Funktion abgearbeitet wird, schon.

Nein.

Obwohl man das so pauschaul auch nicht sagen kann. Ist man auf inlining 
aus, muss der Code in den Header.

Aber abgesehen davon

modul.c
*******
1
Alle Funktionen, die das Modul ausmachen

modul.h
*******
1
Alle Variablen und Funktionsprotoypen, die das Modul einem
2
Verwender zur Verfügung stellt.


Ist ganz einfach:
In *.c File kommt die Implementierung. Im Header File wird die 
'Schnittstelle' beschrieben, die ein Verwender des Moduls benötigt, um 
mit dem MOdul zu arbeiten. Das sind im Regelfall die 
Funktionsprototypen, aber auch Strukurdefinitionen, die zb in 
Funktionsaufrufen benutzt werden. IN einzelnen Fällen können dann auch 
noch globale Variablen vorkommen, mit denen man aber eher sparsam sein 
sollte.

von was?? (Gast)


Lesenswert?

Von einer Funktion sollte in der Header-Datei nur die Deklaration 
stehen! Die Definition der Funktion in der jeweiligen *.c-Datei!

von Fabian K. (fabian_k)


Lesenswert?

OK, dann bin ich eine Ausnahme, die alles in die Header-Datei schreibt 
(ich habs so gelernt).
Aber was macht das für einen Unterschied?

von Karl H. (kbuchegg)


Lesenswert?

Fabian K. schrieb:
> OK, dann bin ich eine Ausnahme, die alles in die Header-Datei schreibt
> (ich habs so gelernt).
> Aber was macht das für einen Unterschied?

Na dann warten wir mal ab, wenn du den Header in mehreren anderen *.c 
Dateien benutzen willst und dein Linker anmeckert, dass er dieselbe 
Funktionsimplementierung 3 mal vorgefunden hat.

von Fabian K. (fabian_k)


Lesenswert?

Soweit bin ich noch nicht, dass ich mehrere c-Dateien habe. Bis jetzt 
hab ich genau eine c-Datei fürs Hauptprogramm, der Rest kommt in libs.
Wenn ich mehrere habe, muss ich mich wohl umstellen.

Aber egal, ich glaube Frage wurde jetzt richtig beantwortet.

von Karl H. (kbuchegg)


Lesenswert?

Fabian K. schrieb:
> Soweit bin ich noch nicht, dass ich mehrere c-Dateien habe.

Dann solltest du vielleicht nicht unbedingt jemanden beratschlagen :-)

> Bis jetzt
> hab ich genau eine c-Datei fürs Hauptprogramm, der Rest kommt in libs.

Du hast ganz sicher keine Libs.
Ein Header-File ist keine Lib :-) Selbst dann nicht, wenn hier im 
µC-Forum so gaten wird, als ob ein abgetrennter Code eine Lib wäre. Aber 
genau genommen ist eine Lib etwas ganz anderes. Wenn du jemals auf 
Desktop Systemen programmierst, wirst du den Unterschied kennen lernen.

von Fabian K. (fabian_k)


Lesenswert?

Ich programmiere nur in meiner Freizeit uC. Ich bin noch in der 
Ausbildung und dort programmiere ich Desktop-Systeme. Deswegen 
interessiert mich der Unterschied umso mehr?

von Martin2 (Gast)


Lesenswert?

Danke schon mal an alle.

Ich habe jetzt also ein Modul bestehend aus einer *.h und einer *.c 
Datei. Dieses Modul möchte ich in mehreren Projekten verwenden. Deswegen 
packe ich beide Dateien in ein "Lib" Verzeichnis. Nun ist die Sache aber 
so in dem Modul wird z.B. ein Pin gesetzt in einem Projekt ist dies P1_2 
in einem anderen Projekt P3_4. In dem Modul habe ich für diesen Pin 
einen Namen deklariert z.b.

#define dummy_pin p1_2

Wo deklariere ich dies am besten, damit ich a) das Modul in einem 
gemeinsamen Verzeichnis ablegen kann und ohne ins Projekt zu kopieren 
verwenden kann und b) ich bei jedem Projekt den dummy_pin an einem 
anderem Portpin deklarieren kann?

von Karl H. (kbuchegg)


Lesenswert?

Eine Library wird so gebaut:

Zuerst wird der Code aufgeteilt. So wie oben

C-File:       Implementierung
Header File:  Schnittstellenbeschreibung

Dann wird das C-File für sich getrennt kompiliert.
Möglicherweise zusammen mit einigen anderen C-Files, die zusammen die 
Library bilden sollen.

Dann nimmt man einen Librarien und bindet all die Object-Files, die man 
vom Compiler für die Einzelteile bekommen hat, zu einer Library 
zusammen.


Dem Kunden, also dem der die Library verwendet, gibt man dann die 
Library selber und die Header Files. In den Header Files finden sich all 
die Beschreibungen und Prototypen wieder, die der Verwender benötigt um 
die Funktionen in der Library aufrufen zu können. Das tut er auch. Er 
compiliert sein Programm und linkt die Library dazu, die dann die 
Implementierungen für die Funktionen liefert.

Vorteil:
* Alle Funktionen sind gemeinsam in einem File, der Library, beisammen. 
Der Verwender muss nur die Lib einlinken und hat alles auf einen Schlag 
verfügbar.
* Der Verwender muss sich nicht mit Compiler Settings rumschlagen, um 
die zugelieferten Funktionen kompilieren zu können. Denn die sind schon 
vorkompiliert in der Library
* Ich kann einem Verwender eine Funktionalität zur Verfügung stellen, 
ohne dass ich ihm den Source Code geben muss. -> Ich kann mein Know-How 
verkaufen, ohne jemanden in meine Karten schauen lassen zu müssen.

von Martin2 (Gast)


Lesenswert?

Ah ich glaube ich habs.

Ich lege eine "pin_def.h" Datei in mein Projekt-Verzeichnis. Diese 
Header Datei include ich dann in der Modul.c Datei. So kann bei jedem 
Projekt eine andere Pinzuordnung erfolgen.

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.