Forum: Compiler & IDEs static Functions deklarieren


von Rainer K. (Gast)


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)?
1
static void test(void);
2
3
void test(void){
4
 ;
5
}
1
static void test (void);
2
3
static void test (void){
4
 ;
5
}

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.

von klaus (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rainer K. schrieb:

> Was ist richtig(er)?

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

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.

von (prx) A. K. (prx)


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.

von Rainer K. (Gast)


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.

von Oliver (Gast)


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

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.