Forum: Compiler & IDEs wann eine Funktion static und wann nicht?


von Marshmallow (Gast)


Lesenswert?

Hallo an alle,
derzeit versuche ich mich an der Grafik-Lib von ST auf einem
STM32F4Discovery,und da ist mir beim durchforsten aufgefallen das einige 
Funktionen static sind und andere wiederum nicht.
Kann mir jemand erklären warum man manche Funktionen als static 
deklariert?

Danke schon im voraus

: Verschoben durch User
von Dennis H. (c-logic) Benutzerseite


Lesenswert?

statische Funktionen sind für Gewöhnlich Funktionen die nur im 
Namensraum der Aktuellen Datei sichtbar sein sollen.
Ein verlinken darauf aus anderen Dateien sollte scheitern.

von Anonym (Gast)


Lesenswert?

Dennis Heynlein schrieb:
> statische Funktionen sind für Gewöhnlich Funktionen die nur im
> Namensraum der Aktuellen Datei sichtbar sein sollen.
> Ein verlinken darauf aus anderen Dateien sollte scheitern.

Verwechselt da nicht jemand static mit private?

von Marshmallow (Gast)


Lesenswert?

Vielen Dank für Deine super schnelle Antwort.
Wenn ich das jetzt richtig verstanden habe bedeutet es, das
wenn ich eine Funktion in einer .h Datei definiert habe, welche
von einer anderen Datei includiert ist, kann ich diese Funktion
aus der includierenden Datei nicht nutzen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Anonym schrieb:
> Verwechselt da nicht jemand static mit private?

Nein. C kennt kein "private".

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Das mit Header-Datei sollte so stimmen.
Wenn die Static-Funktion in einer anderen Datei Definiert ist (und nicht 
deklariert) wird sie nicht erreichbar sein.
Es wird in C genutzt um Doppel-Benennungen zu verhindern und um im 
Rahmen der jeweiligen Datei genutzte "private" Funktionen abzukapseln.

private/private/protected sind objektaffine Deklarationen in C++.

Bei C gibt es da nur extern (default) und static.
Für Variablen ist es ähnlich gedacht, es bietet aber den Vorteil das 
statische Variablen nicht auf dem Stack sondern auf dem Heap angelegt 
werden und zwischen Aufrufen der Funktion erhalten bleiben.

von Dipl Ing (TH) (Gast)


Lesenswert?

Wie chön, daß wir wissen on es sich um C, C#, Java oder Schlag mich tot 
handelt! Für den TO existiert wohl nur eine programmiersprache.
Da meine GLaskugel jatzt C sagt, frage ich mich warum der To nicht mal 
in die weltumspannende Suchmaschine " c static function" eingeben kann
Der erste Link führt auf
http://home.fhtw-berlin.de/~junghans/cref/SYNTAX/static.htm
Und da der erste Satz:
"static Funktionen sind Funktionen, die nur innerhalb eines 
Quelltextfiles sichtbar sind."

Was ist daran jetzt schwer zu verstehen!

Und ich weiß, ein C Buch zu LESEN ist völlig unakzeptabel veraltet und 
uncool.

von Stefan (Gast)


Lesenswert?

Tja, meckern kannst du und auf Google verweise, aber selbst hast Du das 
Googeln wohl nicht nötig!?

Denn dann hättest Du binnen Sekunden herausgefunden, daß die Grafik 
Library von ST in Ansi-C geschrieben wurde.

Was ist daran jetzt schwer zu verstehen?

Und ich weiß, ein andere ausmeckern obwohl man selbst keine Ahnung hat 
ist ja soo cool. Schäm Dich!

von Stephan (Gast)


Lesenswert?

Dennis Heynlein schrieb:
> Bei C gibt es da nur extern (default) und static.

Aber nicht verwechseln mit der Wirkung des Schlüsselwortes "extern" bei 
einem Funktionsprototypen.
S.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Stephan schrieb:
> Aber nicht verwechseln mit der Wirkung des Schlüsselwortes "extern" bei
> einem Funktionsprototypen.

Du meinst sicherlich Variablen. Bei Funktionsprototypen ist "extern" 
implizit (und wird deswegen in 99.99% aller Fälle weggelassen).

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

extern ist bei Funktionen ohne extra Kennzeichnung in C default.

extern (default)

von Marshmallow (Gast)


Lesenswert?

Also vielen Dank für eure (fachliche) Hilfe.
Ich habe es nachdem mir Dennis (c-logic) es auf so einfache
Weise erklärt hat auch ausprobiert, und konnte damit mein Wissen
in Sachen C-Programmierung erweitern. Objekttypische Programmierung
unter C war mir bis dato noch nicht so geläufig.
Es hat sich für mich dann auch herausgestellt, das der Compiler die
Deklaration der static function in einer Header Datei auch gar nicht
akzeptiert und somit auch für andere Dateien gar nicht erreichbar ist.
Nochmals Danke an alle die mir unter die Arme gegriffen haben.

von Karl H. (kbuchegg)


Lesenswert?

Marshmallow schrieb:

> Deklaration der static function in einer Header Datei auch gar nicht
> akzeptiert

natürlich tut er das.
Das kann manchmal sogar sinnvoll und auch notwendig sein, wenn man den 
Sichtbarkeitsbereich einer Funktion auf genau jene Übersetzungseinheit 
beschränken möchte, die diesen Header inkludiert UND der Compiler die 
Funktion dann inlined.

Da das Header-Includieren vom Präprozessor gemacht wird, kann der 
eigentliche C-Compiler ja auch gar nicht unterscheiden, wo ein 
bestimmter Quelltext eigentlich herkommt. Ob der immer schon im C-File 
stand oder ob der aus einem Header-File kam.

: Bearbeitet durch User
von Marshmallow (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> natürlich tut er das.

Hallo Karl Heinz,
also ich muss Dir leider widersprechen. Vieleicht liegt es auch an 
meiner
Unwissenheit, aber wenn ich in Coocox Ver. 1.7.1 die Definition in eine
Headerdatei lege dann bekomme ich eine Compilerwarnung :
"function 'createBtn' declared as 'static' but never defined"
So nun bin ich doch etwas ratlos.

von Rolf Magnus (Gast)


Lesenswert?

Marshmallow schrieb:
> Karl Heinz Buchegger schrieb:
>> natürlich tut er das.
>
> Hallo Karl Heinz,
> also ich muss Dir leider widersprechen. Vieleicht liegt es auch an
> meiner
> Unwissenheit, aber wenn ich in Coocox Ver. 1.7.1 die Definition in eine
> Headerdatei lege dann bekomme ich eine Compilerwarnung :
> "function 'createBtn' declared as 'static' but never defined"
                        ^^^^^^^^             ^^^^^^^^^^^^^^^^^

Du hast offensichtlich keine Definition in die Headerdatei geschrieben, 
sondern nur eine Deklaration. Wenn du diese deklarierte Funktion weder 
im Header, noch in der Datei, die ihn einbindet, definierst, dann ergibt 
das keinen Sinn, daher die Warnung des Compilers.

von Marshmallow (Gast)


Lesenswert?

Natürlich die Deklaration in die Header meinte ich.

von Rolf Magnus (Gast)


Lesenswert?

Wie gesagt: Wenn du die Funktion static deklarierst, aber in der selben 
Übersetzungseinheit nicht auch definierst, gibt's eine Warnung. Das wäre 
aber außerhalb eines Headers genau so.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Marshmallow schrieb:
> Natürlich die Deklaration in die Header meinte ich.

Natürlich funktioniert das, WENN alle Dateien, die diese Headerdatei 
inkludieren, ebenso eine Funktionsdefinition aufweisen. Die Definition 
kann sich ebenfalls in der Headerdatei befinden, aber auch in allen 
inkludierenden Dateien.

Wichtig ist jedoch dabei, dass es sich dann um voneinander unabhängige 
Funktionen mit gleichen Namen handelt. Der Unterschied zu einer 
einzelnen Funktion besteht u.a. darin, dass funktionsglobale Variable, 
die innerhalb der Funktion(en) als static definiert sind, für jede 
Funktion separat existieren und nicht gemeinsam für alle gleichnamigen 
Funktionen, selbst wenn diese inhaltlich identisch sein sollten.

Beispiel:
1
// Headerdatei common.h
2
static int my_function(void) {
3
  static int counter = 0;
4
5
  counter++;
6
  return counter;
7
}
8
9
10
// Uebersetzungseinheit a.c
11
#include <stdio.h>
12
#include "common.h"
13
14
void fn1(void)
15
{
16
  int a;
17
18
  a = my_function();
19
  printf("counter in fn1: %d\n", a);
20
  a = my_function();
21
  printf("counter in fn1: %d\n", a);
22
}
23
24
// Uebersetzungseinheit b.c
25
#include <stdio.h>
26
#include "common.h"
27
28
void fn2(void)
29
{
30
  int a;
31
32
  a = my_function();
33
  printf("counter in fn2: %d\n", a);
34
  a = my_function();
35
  printf("counter in fn2: %d\n", a);
36
}

Die in my_function implementierten Zähler werden unabhängig voneinander 
zählen, je nachdem aus welcher Übersetzungseinheit heraus sie aufgerufen 
werden.

Würde man im obigen Codebeispiel das "static" bei der Definition von 
my_function weglassen, würde der Linker später zu recht bemängeln, dass 
es mehrere Definitionen der Funktion my_function gäbe. Folglich dürfte 
dann nur die Deklaration von my_function in common.h stehen und genau 
eine Definition in einer der Übersetzungseinheiten.

Manchmal(!) ist es aber auch übersichtlicher, die Implementierung einer 
Funktion oder die Initialisierung einer globalen Variable in eine 
Headerdatei auszulagern. Dann sollte man solch einen Block aber durch 
die Präprozessoranweiungen #ifdef COMPILE_MY_FUNCTION und #endif kapseln 
und in genau einer inkludierenden Übersetzungseinheit #define 
COMPILE_MY_FUNCTION setzen.

von Jesper_Hauser (Gast)


Lesenswert?

>Wie chön, daß wir wissen on es sich um C, C#, Java oder Schlag mich tot
>handelt!

hm - Forum GCC

von Florian (Gast)


Lesenswert?

Jesper_Hauser schrieb:
>>Wie chön, daß wir wissen on es sich um C, C#, Java oder Schlag
> mich tot
>>handelt!
>
> hm - Forum GCC

Bleiben ja noch C und Java übrig.

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.