Forum: PC-Programmierung Funktion "privat" per static gibt Warnung?!?


von Michael (Gast)


Lesenswert?

Hallo, zumindest mit dem gnu-Compiler DJGPP für DOS gibts ne Warnung,
wenn ich Funktionen vor dem Zugriff von weiteren Modlen sperren will:

/* foo.h */

static void func(int x);

/* foo.c */

static void funk(int x){
   /* something to do */
}

Fehlermeldung:
setup.h:26: warning: 'foo' declared `static' but never defined

Macht man das nicht so (privat) und ich versteh was falsch?

von Rufus T. Firefly (Gast)


Lesenswert?

Da statische Funktionen nur innerhalb des Modules verwendet werden
können, in dem sie definiert sind, kann man die Deklaration (den
Prototypen) auch in das C-Sourcefile einbauen - Headerdateien sind IMHO
hilfreich, um anderen Modulen den Zugriff auf exportierte Dinge von
Modulen zu ermöglichen.

Allerdings besagt die von Dir zitierte Fehlermeldung, daß ein
statisches Objekt namens foo nie verwendet, sprich: aufgerufen wird.

Wie heisst denn nun die Funktion, func, funk oder foo?

Könnte es sein, daß Du Dich nicht nur in Deinem Post verschrieben hast?

von Michael (Gast)


Lesenswert?

#define func funk   // ;-))

Oh, es war schon spät.... 'foo' heißt das Modul und 'func' ist
'funk' => Funktionsname ;-).

Es gibt jedenfalls in foo.c ne weitere Funktion, die func(int) aufruft.
How ever, pack ich die Deklaration in foo.c, ist die Warnung weg.

Der Übersichtlichkeit gefällts mir aber besser, in *.h sämtliche
Prototypen auf einen Blick zu haben.

Thx
Michael

von Michael (ein anderer) (Gast)


Lesenswert?

@Michael:

Naka, in *.h haben nicht sämtliche Deklarationen eines Moduls etwas zu
suchen, sondern nur die öffentliche Schnittstelle des Moduls. Und ein
"static xyz;" macht in einem *.h auch überhaupt keinen Sinn, ist
schon eher ein grober Fehler.

Vorschläge:

a.) Private Deklarationen in die Implementation (*.c)

b.) Private Deklarationen in eigener Header-Datei (modul_privat.h)

c.) In der Header-Datei "#ifdef MODUL_IMPL" und in der *.c für's
Modul eben "#define MODUL_IMPL" bevor man "#include modul.h"
macht.

Vorschlag c ist meiner Meinung nach der verkorkste. Optimal ist eine
Kombination aus a und b. Statische Deklarationen gehören immer in die
Compile-Unit (*.c), da nur dort sichtbar. Besteht ein Modul aus
mehreren Compile-Units (*.c), dann ist b die einzige sinnvolle Lösung.

von Rufus T. Firefly (Gast)


Lesenswert?

@anderer Michael: Danke, so sehe ich das auch.

von Thomas (Gast)


Lesenswert?

die warnung tritt wohl nicht beim kompilieren von foo.c, sondern eines
anderen .c files auf, das foo.h (möglicherweise indirekt über andere
headerfiles) einbindet.

wie schon erwähnt hat eine static deklaration in einem headerfile
nichts zu suchen.

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.