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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.