extern volatile Variable



  • Hi,
    folgende Frage für C-Standard-Auswendig-kenner:

    per extern deklarierte Variablen, sind die automatisch volatile?
    Weil im Prinzip liegt es ja nahe, dass wennn ich mir eine Variable ran hole die irgendwo anders definiert ist, dass sie dort auch beschrieben wird und ich nix davon mit bekomme.

    MfG,
    Vlad



  • vlad_tepesch schrieb:

    per extern deklarierte Variablen, sind die automatisch volatile?

    nö, das 'volatile' musste immer hinschreiben, wenn's 'volatile' sein soll.

    // file1.c
    int var;
    
    // file2.c
    extern volatile int var;
    var = 1;  // variable wird als 'volatile' angesehen (möglicherweise gibt's mecker vom linker weil's nicht übereinstimmt)
    
    // file3.c
    extern in var;
    var = 1;  // dieselbe variable wird als nicht volatile angesehen, was sie auch ist.
    

    ^^umgekehrt natürlich auch.

    vlad_tepesch schrieb:

    Weil im Prinzip liegt es ja nahe, dass wennn ich mir eine Variable ran hole die irgendwo anders definiert ist, dass sie dort auch beschrieben wird und ich nix davon mit bekomme.

    geschrieben/gelesen wird direkt an der stelle, an der du's im code schreibst. es gibt keine versteckten read/write funktionen an zentralen stellen.
    ^^btw, nix standard sondern erfahrungswerte.
    🙂



  • nö, das 'volatile' musste immer hinschreiben, wenn's 'volatile' sein soll.

    Ok, danke.

    geschrieben/gelesen wird direkt an der stelle, an der du's im code schreibst. es gibt keine versteckten read/write funktionen an zentralen stellen.

    wiso verstekcte read/write befehle?
    wenn ein File ne variable deklariert, wird sie dort ja auch normalerweise beschrieben.

    wenn in einem anderem C-File die variable mit extern benutze, will ich natürlich nicht, dass der Compiler Zugriffe wegoptimiert, weil er denkt die hat immer den selben Wert
    Aber egal, dazuschreiben kann ja nicht schaden.

    BTW, hattest du nicht mal ne ~ vor dem Namen, oder bist du ein anderer?



  • vlad_tepesch schrieb:

    wiso verstekcte read/write befehle?

    sorry, ich hab' deinen satz falsch verstanden.

    vlad_tepesch schrieb:

    BTW, hattest du nicht mal ne ~ vor dem Namen, oder bist du ein anderer?

    hatte ich mal, bin aber derselbe. es gibt übrigens einige, die diesen namen mitbenutzen. das ist nun mal das schicksal von uns unregs.
    🙂



  • vlad_tepesch schrieb:

    wiso verstekcte read/write befehle?
    wenn ein File ne variable deklariert, wird sie dort ja auch normalerweise beschrieben.

    der Compiler muss Speicher für die globale Variable reservieren (bei x86 glaub ich auf dem .data segment? bin nicht ganz sicher). Mit extern weiß der Compiler, dass ein anderes Objekt bereits den Speicher für diese Variable reserviert und nun muss er "nur" auf die Variable zufreifen, sprich muss nur die Addresse kennen, wo die Variable gespeichert wird. Der Linker, der alle Objekte zusammenfügt, wird dann dafür sorgen, dass alle Zugreiffe auf diese Variable immer auf der selben Addresse stattfinden.



  • Das ist doch klar und war auch gar nicht die Frage 😕

    angenommen, du hast folgenden Code:

    file1:

    uint8 var = 0;
    
    void thread1()
    {
      while(true)
      {
        var = GetADC_results();
      }
    }
    

    file2:

    extern uint8 var;
    
    void thread2()
    {
      uint8  i = var;
      uint8  j;
      uint16 sum;
      // mach irgendwas was i nicht verändert
      j = var;
      sum = i+j;
    }
    

    im 2. File könnte der Optimizer auf die idee kommen, die Variable j zu eliminieren und stattdessen einfach i eins hochzuschieben, weil sie nicht volatile ist.

    Edit:
    Es sei denn, das Schlüsselwort extern impliziert volatile.
    Und ich wollte wissen, ob dies der Fall ist.


Anmelden zum Antworten