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
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).
extern ist bei Funktionen ohne extra Kennzeichnung in C default. extern (default)
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.
:
Bearbeitet durch User
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.
>Wie chön, daß wir wissen on es sich um C, C#, Java oder Schlag mich tot >handelt! hm - Forum GCC
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.