Wie kann ich auf eine schattierte globale Variable in C zugreifen? In C++ kann ich verwenden ::
für den globalen Namensraum.
Wie kann ich auf eine schattierte globale Variable in C zugreifen?
vitaly.v.ch
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 wiec
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 dieextern
im innersten Block steht “die Variablec
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;
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
}
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