static-Funktionen: Deklaration & Defintion

Gast #3101906
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
#3101924
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.
#3102469
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.
Moderator Persönliche Seite #3102551
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren