Forum: Compiler & IDEs Variable, global, local oder glolocal?


von Norbert (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Peter K. (Gast)


Lesenswert?

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

von Peter K. (Gast)


Lesenswert?

Nachtrag: und in der Headerdatei ist das ganze dann natürlich NICHT 
deklariert.

von Notker (Gast)


Lesenswert?

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

von Peter K. (Gast)


Lesenswert?

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

von Sascha (Gast)


Lesenswert?

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

von Lourdes Nuñez (Gast)


Lesenswert?

Hola necesito tu opinion sobre el tema ne version castellana , soy
peruana y trabajo en gestion de riesgos. Me ayudas

von Chris (Gast)


Lesenswert?

Dem kann ich nicht ganz zustimmen. Würdest du das bitte begründen?

von Werner B. (Gast)


Lesenswert?

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;

von Chris (Gast)


Lesenswert?

@Werner:
Ich zerstöre ungern Illusionen, aber schau dir mal das Datum der
letzten paar Beiträge an. ;-)

von Stefan Sczekalla (Gast)


Lesenswert?

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

von Chris (Gast)


Lesenswert?

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.

von Chris (Gast)


Lesenswert?

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.

von Werner B. (Gast)


Lesenswert?

@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

von Werner B. (Gast)


Lesenswert?

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

von Stefan Sczekalla (Gast)


Lesenswert?

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

von Jörg Wunsch (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.