Forum: Compiler & IDEs static-Funktionen: Deklaration & Defintion


von Joel (Gast)


Lesenswert?

Hi!

ich habe zwei c-Files: file_a.c und file_b.c
file_a.c enthält die Funktionen int foo(int a) und static int blub(int 
a).
Damit eine Funktion in file_b.c auf die Funktionen von file_a.c 
zugreifen kann habe ich ein Headerfile, das von beiden c-Files 
inkludiert wird und in der die Funktionen wie folgt deklariert sind:
extern int foo(int a);
static int blub(int a);

"foo" funktioniert. Bei blub erhalte ich die Meldung, dass die Funktion 
zwar deklariert, aber nicht definiert ist.

Was mache ich falsch?

Danke.

Gruß
Joel

von Hermann-Josef M. (hermann-josef)


Lesenswert?

blub() darf nicht static sein

EDIT: ... oder muss nochmals in file_b.c enthalten sein.

von Joel (Gast)


Lesenswert?

Hallo!

Die Antwort kam schnell!

blub() darf überhaupt nicht static sein, oder nur im c- oder h-File?

Gruß
Joel

von Joel (Gast)


Lesenswert?

Ah. - Hab da was gefunden:
http://de.wikibooks.org/wiki/C-Programmierung:_static_%26_Co .

"Auch vor Funktionen sowie Variablen außerhalb von Funktionen kann das 
Schlüsselwort static stehen. Das bedeutet, dass auf die 
Funktion/Variable nur in der Datei, in der sie steht, zugegriffen werden 
kann."

von Hermann-Josef M. (hermann-josef)


Lesenswert?

Wenn blub() static ist, dann ist es für den Linker nur in der 
Übersetzungseinheit sichtbar, in der es steht (definiert wird), also 
file_a.c bzw. file_a.o (als Kompilat).

Du könntest es mit inline in file_a.h reinschreiben, dann 'sehen' es 
beide Übersetzungseinheiten.

Was mit static oder extern in einem .h-File drinsteht, dient nur dazu 
dem Compiler die Schnittstelle (Prototyp) einer Funktion bekannt zu 
machen (= Deklaration).

Gruß
Hermann-Josef

EDIT: Dein Beitrag von 14:15: Ja, genau so ist es in C.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Joel schrieb:
> Das bedeutet, dass auf die
> Funktion/Variable nur in der Datei, in der sie steht, zugegriffen werden
> kann.

Streng genommen: nicht "Datei", sondern "Übersetzungseinheit".  Das
ist die Datei selbst sowie alle von ihr inkludierten Dateien.

von Fabian O. (xfr)


Lesenswert?

static-Funktionen sind private Funktionen, die nur in der 
Übersetzungseinheit verwendet werden können, in der sie definiert sind. 
Mit "static" sagt man also explizit, dass die Funktion nicht von 
außerhalb aufgerufen werden darf.

Daher macht es keinen Sinn, static-Funktionen in einer Headerdatei zu 
deklarieren. In der h-Datei stehen nur die öffentlichen (non-static) 
Funktionen, die von anderen Modulen aus aufgerufen werden sollen. Alles 
was nur für das Modul selbst und nicht für den Aufrufer relevant ist, 
hat in der Headerdatei nichts verloren.

Das gilt übrigens auch für Variablen: Alle "globalen" Variablen, die nur 
innerhalb eines Moduls verwendet werden (das sollte der Regelfall 
sein!), gehören mit static deklariert, damit es zu keinen Konflikten mit 
anderen C-Dateien kommt.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Fabian O. schrieb:
> Daher macht es keinen Sinn, static-Funktionen in einer Headerdatei zu
> deklarieren.

Mit einer prominenten Ausnahme: "static inline" für kleine Funktionen,
die sowieso an jeder Stelle durch den Compiler inline eingefügt werden
sollen.  Damit sind sie ja zwangsweise in jeder Übersetzungseinheit
separat zu implementieren (und zwar ggf. sogar mehrfach).

von Rolf M. (rmagnus)


Lesenswert?

Jörg Wunsch schrieb:
> Damit sind sie ja zwangsweise in jeder Übersetzungseinheit
> separat zu implementieren (und zwar ggf. sogar mehrfach).

Vor allem befreit man den Compiler so von der Pflicht, auch eine 
non-inline-Version der Funtion zu erzeugen. Ohne static muß er das, da 
die Funktion ja auch aus einer anderen Übersetzungeinheit heraus 
aufgerufen werden könnte.

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.