Kann ich von außen auf statische Variablen innerhalb einer Funktion zugreifen?
Lesezeit: 3 Minuten
Robin Hsu
C/C++: Kann ich von außen auf statische Variablen innerhalb einer Funktion zugreifen? Zum Beispiel:
#include <iostream>
using namespace std;
void f()
{
static int count = 3;
cout << count << endl;
}
int main(int argc, char** argv)
{
f::count = 5; // apparently this is an invalid syntax.
f();
return 0;
}
rici
Nein, das geht nicht, weder in C noch in C++.
Wenn Sie den einer Funktion zugeordneten Zustand beibehalten möchten, definieren Sie eine Klasse mit dem entsprechenden Zustand und einer Member-Funktion. (In C++. Sie haben die Frage auch mit C getaggt; die gleiche Technik funktioniert, aber Sie müssen die gesamte Grundlagenarbeit selbst erledigen.)
Obwohl sie ihren Nutzen haben, sind nicht-konstante statische Locals meistens eine schlechte Idee. Sie machen Ihre Funktion Thread-unsicher und machen sie oft “einmal aufrufen”.
Const-Statics sind Thread-sicher und oft eine bessere Lösung als statische Datenmember, wenn sie nur von einer Funktion verwendet werden
– Glenn Teitelbaum
4. Juni 2015 um 5:59 Uhr
Glenn Teitelbaum
Auf Variablen innerhalb eines Funktionsbereichs kann extern nicht über den Namen zugegriffen werden, aber Sie können einen Zeiger oder eine Referenz darauf zurückgeben
Du kannst. Aber wir werden sagen, dass die Rückgabe des Zeigers auf die statische Variable der Funktion extrem verwirrend und schlechte Codepraxis wäre. Wenn Sie es brauchen, tun Sie es als globale Variable …
– Vit Bernatik
2. Mai 2018 um 16:17 Uhr
@VitBernatik Warum ist das schlimm?
– Ravi Raj
19. November 2020 um 14:26 Uhr
Lesen Sie einfach diese Empfehlung in Strousoups C++-Leitfaden. Es ist besser als Globals.
– Glenn Teitelbaum
27. September 2021 um 16:02 Uhr
Tarc
Wie in anderen Antworten gesagt wurde, gibt es keine spezielle Syntax für den externen Zugriff auf lokale Variablen, aber Sie können dies erreichen, indem Sie beispielsweise einen Verweis auf die Variable zurückgeben:
#include <iostream>
using namespace std;
int& f(void)
{
static int count = 3;
cout << count << endl;
return count;
}
int main()
{
int &count = f(); // prints 3
count = 5;
f(); // prints 5
return 0;
}
In C++11 können Sie auch von einem zurückgegebenen Lambda aus auf Ihre lokalen statischen Variablen zugreifen:
#include <iostream>
#include <functional>
using namespace std;
std::function<void()> fl()
{
static int count = 3;
cout << count << endl;
return []{count=5;};
}
int main()
{
auto l = fl(); // prints 3
l();
fl(); // prints 5
return 0;
}
Nein, die Variable count ist nur innerhalb der Funktion verfügbar und hat keine Verknüpfung. Die Lebensdauer dieser Variablen wäre jedoch der Umfang der Datei, wie C++ Primer vorschlägt
Jede lokale statische Variable wird initialisiert, bevor die erste Ausführung die Objektdefinition durchläuft. Lokale Statik wird nicht zerstört, wenn eine Funktion endet; Sie werden zerstört, wenn das Programm beendet wird.
Eine statische Variable hat einen Geltungsbereich innerhalb des Blocks, aber sie hat eine Lebensdauer im gesamten Programm, sodass Sie nicht auf die Zählvariable zugreifen können, indem Sie versuchen, einen Zeiger von der Funktion zurückzugeben.
No-Bugs-Hase
Nein, aber (offensichtlich) können Sie es immer außerhalb der Funktion verschieben, damit es für die gesamte Datei zugänglich wird; Abgesehen von der Unordnung des Namensraums auf Dateiebene (was meiner Meinung nach keine große Sache ist), sehe ich keine großen Nachteile für einen solchen Schritt (und es wird auch expliziter und offensichtlicher sein: Anstatt Zugriff auf eine vermeintlich private Sache zu erhalten, Sie werden deutlich machen, dass dieses Ding geteilt werden soll).
Davon abgesehen sollten alle Arten von nicht konstanten statischen Daten mit äußerster Vorsicht verwendet werden, und eine Faustregel (dh bis zum Beweis des Gegenteils) lautet, dass sie eine schlechte Idee sind.
fatihk
In den Sprachen C und C++ ist der Bereich wichtig, in dem die Variable definiert ist. Sie können eine Variable nicht aus oberen Bereichen erreichen.
Zu diesem Zweck können Sie Structs oder C++-Klassen verwenden und diese Daten in den Objekten halten.
14327100cookie-checkKann ich von außen auf statische Variablen innerhalb einer Funktion zugreifen?yes