Dennis S. schrieb:
> Aber mal noch eine abschließende Frage: wenn ich die Sichtbarkeit so
> einfach einschränken kann, in dem ich die Deklaration aus dem Header
> nehme
Das stimmt nun wieder nicht.
Du schränkst die Sichtbarkeit nicht durch rausnehmen aus einem Header
File ein.
Ein Header File hat so gesehen eigentlich nur organisatorische Gründe.
Für den eigentlichen C-Compiler spielt ein Header File überhaupt keine
Rolle. Vor allen Dingen deshalb nicht, weil der eigentliche Compiler ein
Header File überhaupt nicht zu Gesicht kriegt.
> wann benötgt man dann das Schlüsselwort static im Zusammenhang
> mit Funktionen?
weil dich nix und niemand drann hindert, das ganze so zu schreiben:
File: a.c
File b.c
1 | extern foo( void );
|
2 |
|
3 | void bar()
|
4 | {
|
5 | ...
|
6 | foo();
|
7 | }
|
der Default für Funktionen ist es, dass sie aus einer
Übersetzungseinheit heraus exportiert werden.
Ob du das machst, indem du in einem anderen C-File eine explizite
'extern' Deklaration reinbaust, oder ob du die extern Deklaration in ein
Header File schreibst und dieses includierst, spielt keine Rolle (und
kommt effektiv aufs gleiche raus).
Und ja, bei Funktionen darf man 'extern' weglassen, weil durch die
Schreibweise klar ist, ob es sich um eine Deklaration oder einer
Definition handelt.
Edit:
Und nochmal, weil das wichtig ist:
Alle Zeilen, die mit # beginnen, sind Anweisungen an den Präprozessor!
Das ist im Grunde nichts anderes als ein Texteditor, der den
Programmtext modifiziert, ehe ihn der Compiler zu Gesicht kriegt.
Der Präprozessor macht bei einer Zeile
nichts anderes, als den Inhalt der Datei test.h an der Stelle in den
Text einzufügen, an der die #include Zeile steht.
D.h. für den Compiler besteht zwischen
test.h
bar.c
1 | #include "test.h"
|
2 |
|
3 | void bar()
|
4 | {
|
5 | ...
|
6 | foo();
|
7 | }
|
und
bar2.c
1 | extern foo( void );
|
2 |
|
3 | void bar()
|
4 | {
|
5 | ...
|
6 | foo();
|
7 | }
|
KEIN Unterschied! Denn der Präprozessor macht aus der 'include-Form'
durch Text-Ersetzung exakt die 2.te Form, ehe sich dann der C-Compiler
den Text vornimmt.