Funktion "privat" per static gibt Warnung?!?

Gast #199159
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?
Gast #199160
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?
Gast #199161
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
Gast #199162
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.
Gast #199164
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.

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