Variable, die nur in einer c-Datei gültig ist



  • Hallo,

    wie kann ich eine Variable erstellen, die nur innerhalb einer c-Datei gültig ist? Wenn ich einfach "int x;" in jede Datei schreibe erhalte ich den Fehler "multiple definition of `x'".
    Ich verwende einen C30 Compiler für PIC24.

    Bg,
    heka



  • static int i;



  • Danke für die schnelle Antwort.



  • Das kann so nicht ganz stimmen. Static hat damit nichts zu tun. Eine Deklaration ist erstmal immer nur lokal gültig und sichtbar.

    Ich schätze, du bindest dein C-File per include in ein anderes ein, oder? Das Problem ist, dass alles, was du mit include einbindest, quasi dort geschrieben steht. Also hast du zwei "int x" hintereinander.

    Stattdessen solltest du dir mal anschauen, wie man mit Header-Dateien arbeitet...



  • Heimelchen schrieb:

    Das kann so nicht ganz stimmen. Static hat damit nichts zu tun.

    Doch. Static bei globalen Variablen hat eine andere Bedeutung als bei lokalen Variablen!

    Eine Deklaration ist erstmal immer nur lokal gültig und sichtbar.

    Nein.

    #include ist ja nur eine Textersetzung!

    // a.c
    
    int a = 10; // und dann probier mal hier static aus. Dann scheitert das kompilieren mit einer undefined reference.
    
    int foo(void) {
      return a;
    }
    
    // b.c
    #include <stdio.h>
    
    extern int a;
    extern int foo(void);
    
    int main() {
      printf("%d %d\n", foo(), a);
      printf("%d\n", ++a);
      printf("%d %d\n", foo(), a);
    }
    


  • Was hat das jetzt mit dem Problem zu tun?

    Ohne das jetzt auszuprobieren: klar erzeugt ein static eine undefinierte Referenz, weil beim extern auch ein static dazu muss. Und Inkrementieren wird dann wohl nicht mehr gehen...

    Das Problm war ja auch keine undefinierte Referenz, sondern eine mehrfach definierte. Und da ich aus dem Posting entnehme, dass heka noch nicht allzu viel Erfahrung mitbringt, wird ihr/ihm dein Thread sicher weiter helfen... 👍



  • Heimelchen schrieb:

    Was hat das jetzt mit dem Problem zu tun?

    Alles. rüdiger hat quasi erklärt, wo das Problem liegt. Ohne static ist "int a = 10;" eine programmweite globale Variable. Das Schlüsselwort static besagt, dass auf a nur innerhalb der *.c Datei zugegriffen werden kann, in der es deklariert wurde.

    Heimelchen schrieb:

    ... weil beim extern auch ein static dazu muss.

    Schwachsinn.

    Wäre vielleicht doch ganz sinnvoll, wenn du den oben geposteten Code mal ausprobierst.



  • sofern deine Variable den gleichen Wert besitzt, dann könntest du auch mit extern arbeiten



  • feigling schrieb:

    Ohne static ist "int a = 10;" eine programmweite globale Variable.

    Ach ja, richtig.

    PS: Wenn das Problem nicht gelöst sein sollte, kann heka ja nochmal nachfragen. Bevor ich mich hier jetzt mit profilierungssüchtigen Kiddies rumärgere...



  • Heimelchen schrieb:

    Bevor ich mich hier jetzt mit profilierungssüchtigen Kiddies rumärgere...

    Erst kramst du einen beantworteten Thread raus, schreibst Blödsinn hinein und nachdem man dich darauf hingewiesen hat, dass dein Beitrag Blödsinn war, beschimpfst du die anderen Poster als "profilierungssüchtige Kiddies". Wenn heka mit der gegebenen Antwort nicht zufrieden ist, dann wird er sich sicher wieder melden und ob er dann die Hilfe von jemandem benötigt, der die Bedeutung von static nicht kennt, ist fragwürdig.



  • Ich würde mal sagen: rüdiger gewinnt gegen Heimelchen mit 2:0, Sache gegessen. Und jetzt vertragt euch wieder, ihr profilierungsscheuen Grownups! 😉


Anmelden zum Antworten