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
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.
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?
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?
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.
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.
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!
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.
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).
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.
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.
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.
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.
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.
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.
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.