Kann ich von außen auf statische Variablen innerhalb einer Funktion zugreifen?

Lesezeit: 3 Minuten

Benutzeravatar von Robin Hsu
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;
}

Benutzeravatar von rici
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

Benutzeravatar von Glenn Teitelbaum
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

Benutzeravatar von Tarc
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.

Benutzeravatar von No-Bugs Hare
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.

Benutzeravatar von fatihk
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.

1432710cookie-checkKann ich von außen auf statische Variablen innerhalb einer Funktion zugreifen?

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

Privacy policy