globale Variable von anderem File lokal extern deklarieren möglich?

Gast #3339811
Lesenswert?
• ▲
▼
Hallo zusammen,

ich bin gerade am Debuggen und frage mich ob mein Konstrukt so überhaupt 
erlaubt ist. Folgender Aufbau:

afile.c:
1
uint8_t var = 0;
2

3
void foo( void )
4
{
5
    // work with var
6
    var++;
7
}

bfile.c:
1
void resetVar( void )
2
{
3
    extern uint8_t var;
4
    var = 0;
5
}

ist das so mit dem AVR-GCC erlaubt? also eine Variable die in der einen 
Datei global ist, in der anderen Datei nur lokal und trotzdem extern zu 
deklarieren?

Klar in dem Minimalbeispiel hier kann resetVar auch in afile.c 
geschieben werden und man kann sich das extern sparen, in meiner 
Anwendung geht das aber nicht so einfach und ich glaube fast, dass daran 
mein Programm scheitert.

Vielen Dank
Gruß Martin
Gast #3339847
Lesenswert?
• ▲
▼
Das ist eine der Fragen, die sich mit etwas Abstand ganz plötzlich wie 
von selbst beantworten.

Was geht, ist eine lokale Variable mit gleichem Namen, wie eine globale 
(ob extern oder nicht, ist dabei egal). Die lokale "verdeckt" in diesem 
Fall die globale.

Oliver
Gast #3339957
Lesenswert?
• ▲
▼
OK, es hat etwas gebraucht aber ich bin doch noch auf den Hund gekommen 
wie ich's testen kann. So ne Pause wirkt doch Wunder!
Nur entspricht mein Ergebnis nicht dem, was ich aus deiner Antwort 
erwartet hätte:

Der Test
 main.c
1
#include <avr/io.h>
2
#include "extern.h"
3

4
void reset( void );
5

6
int main( void )
7
{
8
  while(1)
9
  {
10
    extern uint8_t var;
11
    if( var != 0 )
12
      reset();
13
    foo();
14
  }
15
  return 0;
16
}
17

18
void reset( void )
19
{
20
  extern uint8_t var;
21
  var = 0;
22
}

 extern.h
1
void foo( void );

 extern.c
1
#include "extern.h"
2
#include <avr/io.h>
3

4
uint8_t var = 0;
5

6
void foo( void )
7
{
8
  var++;
9
}

Das Ergebnis
 .lss-file
1
0000005c <main>:
2
int main( void )
3
{
4
  while(1)
5
  {
6
    extern uint8_t var;
7
    if( var != 0 )
8
  5c:  80 91 00 01   lds  r24, 0x0100
9
  60:  88 23         and  r24, r24
10
  62:  11 f0         breq  .+4        ; 0x68 <main+0xc>
11
}
12

13
void reset( void )
14
{
15
  extern uint8_t var;
16
  var = 0;
17
  64:  10 92 00 01   sts  0x0100, r1
18
  while(1)
19
  {
20
    extern uint8_t var;
21
    if( var != 0 )
22
      reset();
23
    foo();
24
  68:  01 d0         rcall  .+2        ; 0x6c <foo>
25
  6a:  f8 cf         rjmp  .-16       ; 0x5c <main>
26

27
0000006c <foo>:
28

29
uint8_t var = 0;
30

31
void foo( void )
32
{
33
  var++;
34
  6c:  80 91 00 01   lds  r24, 0x0100
35
  70:  8f 5f         subi  r24, 0xFF  ; 255
36
  72:  80 93 00 01   sts  0x0100, r24
37
}
38
  76:  08 95         ret

... ist das jetzt Verlässlich?
Gast #3339996
Lesenswert?
• ▲
▼
A. K. schrieb:
> Johann liegt richtig, Oliver nicht.

Johann habe ich vollkommen übersehen, da war ich wohl selbst schon im 
schreiben...

A. K. schrieb:
> Oliver schrieb:
>> (ob extern oder nicht, ist dabei egal).
>
> Keineswegs. Es ist der entscheidende Unterschied.

du meinst, dass 'extern' der entscheidende Unterschied ist, verstehe ich 
das richtig?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.