Forum: Mikrocontroller und Digitale Elektronik Globale variablen extern


von Matthias F. (frank91)


Lesenswert?

Hi

ich möchte einige globale Variablen in mehrere c Dateien einbinden.
Ich weiß, dass es hierzu schon einige Beiträge gibt wie:
Beitrag "Globale Variablen, mehrere Dateien"
oder
http://www2.informatik.uni-halle.de/lehre/c/c_globv.html

Meine Frage ist eigentlich nur, ob ich EXTERN hierfür überhaupt 
benötige.
(Was genau EXTERN macht verstehe ich noch nicht so ganz^^)

Ich habe nämlich mittels Atmel Studio 6 folgendes Programm mittels 
Debugger ausprobiert und es funktioniert so. Oder gibt es einen 
Schönheitsfehler, welchen ich nicht bemerkt habe?

Ich habe auch irgendwo mal gelesen, dass man die global.h in jedes c 
file einbinden müsste. Dies geht aber nicht, da dann die Meldung
redefinition of 'a'
erscheint.


//------main.c-------
#include <avr/io.h>

#include "global.h"
#include "test.c"
#include "test2.c"

int main(void)
{
    while(1)
    {
    hoch();
    hoch_2();
    a++;
    }
}

//-------global.h------
uint8_t a =2;

//------test.c-----
void hoch (void)
{
  a++;
}

//----test2.c
void hoch_2(void)
{
  a=a+2;
}

von DirkB (Gast)


Lesenswert?

Code mittels #include einzubinden ist sehr schlechter Stil.
Die einzelnen .c werden normalerweise einzeln compiliert (in 
Objektdateien) und dann vom Linker zusammen gebunden.

Dann darfst du deine globalen Variablen auch nicht mehr in der .h 
definieren sondern nur deklarieren. Und da gehört dann auch das extern 
davor, damit der Compiler weiß, dass die Variable woanders definiert 
wurde.
1
//------main.c-------
2
#include <avr/io.h>
3
4
#include "global.h"
5
#include "test.h"
6
#include "test2.h"
7
8
uint8_t a =2;
9
10
int main(void)
11
{
12
    while(1)
13
    {
14
    hoch();
15
    hoch_2();
16
    a++;
17
    }
18
}
19
//-------global.h------
20
extern uint8_t a;
21
22
//------test.c-----
23
#include "global.h"
24
void hoch (void)
25
{
26
  a++;
27
}
28
29
//------test.h-----
30
void hoch (void);
31
32
//----test2.c
33
#include "global.h"
34
void hoch_2(void)
35
{
36
  a=a+2;
37
}
38
39
//----test2.h
40
void hoch_2(void);

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.