mikrocontroller.net

Forum: Compiler & IDEs static Functions deklarieren


Autor: Rainer K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Community,

entschuldigt die Anfängerfrage, aber ich finde nirgendwo eine aussage 
zum Sachverhalt wie man richtig und sauber eine Funktion als static 
deklariert. Genügt es die function im Prototype als static zu 
deklarieren oder muss man dies in der definition selbst tun? Oder aber 
sowohl als auch?

Was ist richtig(er)?
static void test(void);

void test(void){
 ;
}
static void test (void);

static void test (void){
 ;
}

Gefühlsmäßig würde ich auf die erste Variante Tippen, denn der 
Geltungsbereich wird über die Deklaration des Prototypen festgelegt. Ist 
die funktion nicht Static und soll von einem anderen Module verwendet 
werden muss schließlich auch der Prototyp zugänglich gemacht werden. 
Vielleicht ist das ein irrtum.
Der GCC kompiliert mir beides, und es scheint beides den selben Effekt 
zu haben, aber der GCC "frist ja bekanntlich alles".

Ach und am Rande, mir ist aufgefallen das es Menschen gibt die eine 
static Funktion in eine Header-Datei schreiben. Denn Sinn davon verstehe 
ich nicht... Ich verstehe eine Header-Datei als eine Art Schnittstelle, 
die nur Funktionen, Definitionen, etc. nach außen zugänglich macht die 
für die Verwendung des Moduls notwendig sind (Kapselung). Den "Benutzer" 
des Modules sollten eigentlich static Funktionen nicht die Bohne 
interessieren, die sind quasi privat.

Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm letzteres. Wenn das Modul größer wird und Deklaration und 
Definition weiter voneinander entfernt sind, ist sofort immer klar was 
exportiert wird und was nicht.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rainer K. schrieb:

> Was ist richtig(er)?

Beides ist korrekt, außerdem noch korrekt wäre:
static void test (void){
  ;
}

sofern du keine forward -Deklaration brauchst (also die Funktion
erst nach der Definition benötigt wird).

Wie klaus schon schrieb, sollte man die scheinbar widersprüchliche
Variante, bei der das "static" nur in der Deklaration steht, aus
Gründen der Lesbarkeit eher vermeiden.

> Ach und am Rande, mir ist aufgefallen das es Menschen gibt die eine
> static Funktion in eine Header-Datei schreiben. Denn Sinn davon verstehe
> ich nicht...

Hätte nur Sinn in der Kombination "static inline".  Damit der Compiler
die Funktion inline erweitern kann, muss er allerdings an dieser Stelle
auch noch den Code für die Funktion finden.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rainer K. schrieb:

> deklariert. Genügt es die function im Prototype als static zu
> deklarieren oder muss man dies in der definition selbst tun? Oder aber
> sowohl als auch?

Wobei es eine Geschmacks/Philosophiefrage ist, ob man oben in den 
Quellcode einen Stapel Funktiondeklarationen für den Inhalt des Files 
reinklebt, oder die Funktionen entsprechend ihrer Verwendung sortiert.

Faule Leute schreiben die Unterprogramme oben rein, die Hauptfunktionen 
darunter, und ersparen sich so die separaten Deklarationen.

Autor: Rainer K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich danke euch für eure Anmerkungen! Bin jetzt schlauer. Ich schreib 
jetzt einfach static beide Male hin.

@ A. K.: Die Variante ohne Prototyp deklarationen ist natürlich auch 
nicht schlecht, wird aber, wenn man es nicht von Anfang an macht, bei 
größeren Modulen schnell caotisch; von wegen Nachsortieren.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Faule Leute schreiben die Unterprogramme oben rein, die Hauptfunktionen
> darunter, und ersparen sich so die separaten Deklarationen.

Ganz faule sparen sich auch das sortieren, lassen den Compiler einmal 
meckern, und schreiben dann nur die benötigten Deklarationen oben rein.

Oliver

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.