Hallo C-Experten, mein Programm habe ich bisher in einer .c- und einer .h-Datei untergebracht. Der Übersicht wegen habe ich das Ganze nun aufgeteilt. Es entstanden sechs .c-Dateien und sechs zugehörige .h-Dateien. Mein Problem: Z.B. die Datei nr_drei.c enthält mehrere Funkionen welche in nr_drei.h deklariert werden. Die localen Variablen werden ja in den jeweiligen Funktionen deklariert. Es gibt aber auch Variable die in mehreren Funktionen in nr_drei.c benutzt werden. Muss ich diese in nr_drei.h deklarien? Sind dies die globalen Variablen der Datei nr_drei.c Und dann gibt es Variable die in mehreren .c-Dateien des ganzen Projektes benutzt werden. Diese deklariere ich in main.h. Sind dies denn die globalen Variablen des Projektes? Vielen Dank für eine Antwort Norbert
Hi Norbert, also ich mache das immer so: Die Datei x.c enthält die Funktionen fx0(), fx1() und die Variablen vx0, vx1, die auch von anderen Dateien benötigt werden. Dann deklariere ich fx0(), fx1(), vx0, vx1 in der Datei x.h. Und alle anderen Dateien, die es benötigen includieren dann die Datei x.h Somit weiß ich immer, in welcher Datei die Funktionen / Variablen stehen und in welchen anderen sie benötigt werden. Und in main.h stehen nur allgemeine Definitionen, z.B.: #define XTAL 11.0592e6 #define BAUD 9600 Peter
Hi Norbert,
>>Es gibt aber auch Variable die in mehreren Funktionen in nr_drei.c benutzt
werden.
Nur hier, sonst nicht? Dann nimm static, ist in ANSI C für sowas da.
Damit schränkst Du den Sichtbarkeitsbereich ein und die Namen
kollidieren nicht mit Variablen in anderen Quelldateien. Das kannst du
auch für Hilfsfunktionen benutzen, die nur in der Datei selbst verwendet
werden sollen.
Peter
Nachtrag: und in der Headerdatei ist das ganze dann natürlich NICHT deklariert.
static bewirkt aber nur, dass der Speicherplatz der Variablen bestehen bleibt und nicht bei jedem Prozeduraufruf dynamisch wieder angelegt werden soll, wie der Name static ja schon sagt. Variable des Typs "static" sind nur innerhalb des Blocks, in dem sie deklariert sind, auch sichtbar! Für Variable, die im gesamten Programm zugänlich sein sollen (globale Variable), gibt es den Spezifizierer "extern". Notker
Entweder hast Du mich falsch verstanden oder Du kennst nicht den Unterschied zwischen "static in Funktionen" und "static außerhalb von Funktionen". Steht aber wohl in fast jeder Einführung in Ansi C(ok, in den knowware Dingern für 8DM evtl. nicht) static innerhalb von Funktionen verändert die Lebensdauer, wie Du geschrieben hast. static außerhalb von Funktionen schränkt die Sichtbarkeit der Variablen (und auch Funktionen) auf das modul (also die eine Quelldatei) ein. Wenn Norbert also in nr_drei.c eine variable errnr benutzt die außerhalb einer funktion definiert ist weil er sie in mehreren Funktionen von nr_drei.c braucht und außerhalb von nr_drei.c braucht er errnr nicht, kann/sollte er diese static definieren. Das Modul kann dann leichter wiederverwendet werden da er es auch mit anderen Modulen linken kann die vielleicht auch zufällig ein eigenes errnr benutzen. Peter
Hallo, habe eine etwas anderes Problem. Ich will mit der IAR-Software 2 Variablen im ganzen C-Programm zugänglich machen. Bei einer Variablen ist das kein Problem aber bei 2 oder mehr steigt der debugger aus und es geht nichts mehr. Was könnte man hier machen, oder ist das ein IAR-Problem. Gruß Sascha
Hola necesito tu opinion sobre el tema ne version castellana , soy peruana y trabajo en gestion de riesgos. Me ayudas
Dem kann ich nicht ganz zustimmen. Würdest du das bitte begründen?
Ein beispiel sagt mehr als 1000 Worte... Schreib' in deine .h Datei /* Externene Variablen aus modul xyz.c */ extern int var1; extern unsigned long langevar; und in die .c Datei /* Variable die über xyz.h exportiert werden */ int var1; unsigned long langevar;
@Werner: Ich zerstöre ungern Illusionen, aber schau dir mal das Datum der letzten paar Beiträge an. ;-)
Hi, da ich da auch aktuell ein Thema hab möchte ich da doch gerne einhaken. ich hab eine funktion deklariert: void blah ( uint8_t Key ) { static uint8_t state; (...) switch (state) case 0: /* machwas */ if ( Key == irgendwas ) state++ break; case 1: /* machwasanderes */ (... ) } ich hatte das mit dem static jetzt so verstanden das "state" nur innerhalb der funktion "sichtbar" ist und seinen wert "behält" Oder mus ich dafür eine Globale variable nehmen ? Grüße, Stefan
Nee... Schau dir bitte das dritte Posting Peter K. in diesem Thread an, da ist das erklärt. static innerhalb einer Funktion bedeutet etwas völlig anderes als static vor globalen Variablen.
p.s.: Variablen, die innerhalb einer Funktion deklariert werden, sind immer nur innerhalb dieser Funktion sichtbar. Völlig egal, welchen Modifizierer oder Speicherklasse du zuweist.
@Stefan aber im Prinzip hast Du recht ! Du hast ja nicht behauptet es wäre nicht sichtbar weil es innerhalb der funktion static deklariert worden ist. ;) Werner
Das neudeutsche Stichwort hier heißt "Scope" A) Global scope - Im gesamten Programm sichtbar; "extern" deklariert. Anwendbar auf Variable und Funtionen. B) File local scope - nur innerhalb der Datei sicht- und verwendbar. Verwendung des Schlüsselwortes "static" auf Dateiebene. Funtionen und Variable. C) Local scope - nur innerhalb des Blocks sicht- und verwendbar. Ein Block wird durch "{" und "}" geklammert. In "C" können nur (unsichersei - meine Compilertheorietage sind schon ein wenig her) Variable einen lokalen scope haben, in "C++" auch Methoden. Nicht static deklarierte Variable werden beim Betreten des Scope (Programmfluss tritt in den Block ein) erzeugt und beim verslassen wieder zerstört. Variablen des lokalen (lokaleren) Scope überschreiben den Sichtbarkeitsbereich von Varibalen eines äußeren Scope. z.B. ein "int i;" in einer Funktion hat innerhalb dieses Funktions-Scope Vorrang vor einem globalen "double i;" und ein "long i; innerhalb einer while() Schleife in dieser Funktion hat wiederum innerhalb dieser while Schleife vorrang vor dem int i;. (Bei C++ wird's noch etwas komplizierter - abhänging welcher Standard unterstützt wird.) Als static deklarierte Variablen werden beim Programmstart erzeugt und behalten ihren Wert bis dieser exlizit geändert wird (ebenso wie global Variable). D) ??? mir fällt jetzt auf die schnelle kein weiterer ein. Zu beachten bei globalen Variablen ebenso wie bei static Variablen ist die "Reentranz" bzgl. der Interruptverarbeitung. Falls ein Vordergrundprogramm (überlicherweise main()) auf eine globale Variable zureifen will die von einer Interruptroutine geädert werden kann, so muss dieser Zugriff bzw. die Änderung "atomar" erfolgen. In diesem Zusammenhang ist auch das vielfach missverstandene Schlüsselwort "volatile" einzuordnen. Aber Reentranz und volatile sind eigentlich einen eigenen Thread Wert (oder ein Buch?) (schwitz-fertig) Werner
Hi, mir geht es eigentlich auch weniger um die "Sichtbarkeit" - ich möchte eigentlich, das wenn immer die Funktion aufgerufen wird, die Variable "state" noch mit dem gleichen Inhalt existiert, den sie am ende der letztmaligen Ausführung der funktion hatte. oder denke ich da jetzt um die Ecke ? Grüße, Stefan
Das ist immer dann gegeben, wenn sie statischen Speicher besitzt. Das Gegenteil zu statischem Speicher wäre automatischer Speicher. Automatischen Speicher besitzen alle nicht näher spezifizierten Variablen, die innerhalb einer Funktion deklariert sind. Alles andere ist mithin statisch, egal ob es in Werners Scope-Einteilung nach A, B oder C zu sortieren wäre. Deklaration als "static" innerhalb einer Funktion ist die sinnvollste Variante für diesen Zweck (weil dann der Scope auch noch auf den für die notwendige Wirkung kleinsten Bereich eingeengt wird).
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.