Wie kann ich auf eine schattierte globale Variable in C zugreifen?

Lesezeit: 4 Minuten

Benutzeravatar von vitaly.v.ch
vitaly.v.ch

Wie kann ich auf eine schattierte globale Variable in C zugreifen? In C++ kann ich verwenden :: für den globalen Namensraum.

  • Die Lösung besteht darin, das Überschatten von Variablen zu vermeiden … unweigerlich wird es Sie durcheinander bringen … (ich spreche aus Erfahrung)

    – Spudd86

    14. Juni 2010 um 20:42 Uhr

Wenn Ihre Dateibereichsvariable nicht statisch ist, können Sie eine Deklaration verwenden, die extern in einem verschachtelten Bereich verwendet:

int c;

int main() {
    {
        int c = 0;
        // now, c shadows ::c. just re-declare ::c in a 
        // nested scope:
        {
            extern int c;
            c = 1;
        }
        // outputs 0
        printf("%d\n", c);
    }
    // outputs 1
    printf("%d\n", c);
    return 0;
}

Wenn die Variable mit static deklariert ist, sehe ich keine Möglichkeit, darauf zu verweisen.

  • Wenn es statisch ist, fügen Sie eine weitere statische Variable hinzu static int *address_of_c=&c; im gleichen Umfang wie c und dann verwenden *address_of_c um darauf zuzugreifen.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    21. September 2011 um 4:34 Uhr

  • @R .. Ich habe es als Herausforderung verstanden, auf “::c” zuzugreifen, ohne Dinge zum globalen Bereich hinzuzufügen.

    – Johannes Schaub – litb

    21. September 2011 um 10:31 Uhr

  • Wenn die Variable dateistatisch ist (also die erste Zeile ist static int c = 42;zum Beispiel), dann die extern im innersten Block steht “die Variable c außerhalb der aktuellen Funktion definiert und bezieht sich auf die Dateibereichsvariable. Oder zumindest interpretiert es GCC 4.8.2 so.

    – Jonathan Leffler

    13. Januar 2014 um 6:23 Uhr

  • @JohannesSchaub-litb C hat das nicht ::? Und laut dieser Antwort ist es unmöglich, auf die schattierte Variable in C zuzugreifen.

    – Quazi Irfan

    13. Februar 2017 um 6:26 Uhr

  • @JohannesSchaub-litb, ja, das ist 6.2.2 p4: … Wenn die vorherige Erklärung eine interne oder externe Verknüpfung angibt, ist die Verknüpfung des Identifikators bei der späteren Erklärung dieselbe wie die Verknüpfung, die bei der vorherigen Erklärung angegeben wurde.

    – Jens Gustedt

    1. November 2020 um 21:31 Uhr

Es gibt kein :: in c, aber Sie können eine Getter-Funktion verwenden

#include <stdio.h>

int L=3;

inline int getL()
{
   return L;
}

int main();
{
   int L = 5;

   printf("%d, %d", L, getL());
}

  • Ich habe versucht, die Antwort zu bearbeiten, aber die Bearbeitungswarteschlange ist voll !!. Also füge ich hier den korrigierten Code hinzu: #include <stdio.h> int L=3; static inline int getL() { return L; } int main() { int L = 5; printf("%d, %d", L, getL()); }

    – B_San

    9. Mai um 19:07 Uhr


Wenn Sie über beschattete globale Variablen sprechen, können Sie (unter Linux) verwenden dlsym() So finden Sie eine Adresse der globalen Variablen:

int myvar = 5;    // global

{
    int myvar = 6;    // local var shadows global
    int *pglob_myvar = (int *)dlsym(RTLD_NEXT, "myvar");
    printf("Local: %d, global: %d\n", myvar, *pglob_myvar);
}

Wenn Sie möchten, dass Ihr Code sexy aussieht, verwenden Sie ein Makro:

#define GLOBAL_ADDR(a,b)  b =(typeof(b))dlsym(RTLD_NEXT, #a)
...
int *pglob_myvar;
GLOBAL_ADDR(myvar, pglob_myvar);
...

Je nachdem, was Sie anrufen abgeschirmte globale Variable in Csind verschiedene Antworten möglich.

Wenn Sie eine globale Variable meinen, die in einer anderen Quelldatei oder einer verknüpften Bibliothek definiert ist, müssen Sie sie nur mit erneut deklarieren extern Präfix:

extern int aGlobalDefinedElsewhere;

Wenn Sie eine globale Variable meinen, die von einer lokalen Variablen mit demselben Namen überschattet (oder verdunkelt, wählen Sie die von Ihnen bevorzugte Terminologie) ist, gibt es in C keine eingebaute Möglichkeit, dies zu tun. Sie müssen es also entweder nicht tun oder umgehen es. Mögliche Lösungen sind:

  • Getter/Setter-Funktionen für den Zugriff auf globale Variablen (was eine gute Praxis ist, insbesondere in Multithread-Situationen)

  • Aliase auf Globals über einen Zeiger, der vor der lokalen Variablen definiert ist:

    int noName;
    {
        int * aliasToNoName = &noName; /* reference to global */
        int noName;                    /* declaration of local */
        *aliasToNoName = noName;       /* assign local to global */
    }
    

Was ist eine “abgeschirmte globale Variable” in reinem C?

In C gibt es lokale Variablen, lokale/globale Dateivariablen (statisch) und globale Variablen (extern)

so file1.c:
int bla;

file2.c
extern int bla;

Benutzeravatar von David Neiss
David Neiß

Eine weitere Option besteht darin, auf das globale zu verweisen, bevor Sie Ihr lokales definieren, oder zumindest zuerst einen Zeiger darauf zu erhalten, damit Sie darauf zugreifen können, nachdem Sie Ihr lokales definiert haben.

#include <stdio.h>

int x = 1234;
int main()
{
   printf("%d\n",x); // prints global
   int x = 456;
   printf("%d\n",x); // prints local
}

1390160cookie-checkWie kann ich auf eine schattierte globale Variable in C zugreifen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy