mikrocontroller.net

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


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (ein anderer) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@anderer Michael: Danke, so sehe ich das auch.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.