Wann ist es in Ordnung, eine globale Variable in C zu verwenden?

Lesezeit: 7 Minuten

Benutzeravatar von Adam Davis
Adam Davis

Anscheinend gibt es da draußen viele verschiedene Meinungen, die von “Niemals! Immer kapseln (auch wenn es nur ein Makro ist!)” zu “Es ist keine große Sache – verwenden Sie sie, wenn es bequemer ist als nicht.

So.

Konkrete, konkrete Gründe (am besten mit Beispiel)

  • Warum globale Variablen gefährlich sind
  • Bei globalen Variablen sollte anstelle von Alternativen verwendet werden
  • Welche Alternativen gibt es für diejenigen, die versucht sind, globale Variablen unangemessen zu verwenden?

Obwohl dies subjektiv ist, werde ich eine Antwort auswählen (die meiner Meinung nach am besten die Liebe/Hass-Beziehung darstellt, die jeder Entwickler mit Globals haben sollte) und die Community wird direkt darunter für ihre Stimme stimmen.

Ich glaube, es ist wichtig für Neulinge, diese Art von Referenz zu haben, aber bitte verwirren Sie es nicht, wenn eine andere Antwort existiert, die Ihrer im Wesentlichen ähnlich ist – fügen Sie einen Kommentar hinzu oder bearbeiten Sie die Antwort einer anderen Person.

Benutzeravatar von Dan Cristoloveanu
Dan Christoloveanu

Variablen sollten immer einen möglichst kleinen Geltungsbereich haben. Das Argument dahinter ist, dass Sie jedes Mal, wenn Sie den Bereich erweitern, mehr Code haben, der möglicherweise die Variable ändert, wodurch die Lösung komplexer wird.

Es ist daher klar, dass die Vermeidung der Verwendung globaler Variablen bevorzugt wird, wenn das Design und die Implementierung dies natürlich zulassen. Aus diesem Grund ziehe ich es vor, keine globalen Variablen zu verwenden, es sei denn, sie werden wirklich benötigt.

Der ‘nie’-Aussage kann ich auch nicht zustimmen. Wie jedes andere Konzept sind globale Variablen etwas, das nur bei Bedarf verwendet werden sollte. Ich würde lieber globale Variablen verwenden als einige künstliche Konstrukte (wie das Herumreichen von Zeigern), die nur die wahre Absicht verschleiern würden.

Einige gute Beispiele für die Verwendung globaler Variablen sind Singleton-Pattern-Implementierungen oder Registerzugriffe in eingebetteten Systemen.

Wie man die übermäßige Verwendung globaler Variablen tatsächlich erkennt: Inspektion, Inspektion, Inspektion. Immer wenn ich eine globale Variable sehe, muss ich mich fragen: Wird das WIRKLICH auf globaler Ebene benötigt?

  • Außerdem ist es im Produktionscode sehr frustrierend, wenn Ihr Projekt wiedereintrittsfähig und/oder Thread-sicher sein muss. Wenn jemand später Ihr Projekt mit 20.000 Zeilen erbt, stellen Sie sich vor, wie viel Spaß er daran haben wird, das Ganze bis zu dem Punkt umzugestalten, an dem es wahrscheinlich effizienter ist, es von Grund auf neu zu schreiben.

    – Wolke

    17. April 2015 um 15:34 Uhr

Die einzige Möglichkeit, globale Variablen zum Laufen zu bringen, besteht darin, ihnen Namen zu geben, die sicherstellen, dass sie eindeutig sind.

Dieser Name hat normalerweise ein Präfix, das einem “Modul” oder einer Sammlung von Funktionen zugeordnet ist, für die die globale Variable besonders fokussiert oder bedeutsam ist.

Das bedeutet, dass die Variable zu diesen Funktionen „gehört“ – sie ist ein Teil von ihnen. Tatsächlich kann das Global normalerweise mit einer kleinen Funktion „verpackt“ werden, die mit den anderen Funktionen einhergeht – in derselben .h Datei gleichen Namenspräfix.

Bonus.

Wenn Sie das tun, ist es plötzlich nicht mehr Ja wirklich global nicht mehr. Es ist jetzt Teil eines Moduls verwandter Funktionen.

Das kann stets getan werden. Mit ein wenig Nachdenken kann jede ehemals globale Variable einer Sammlung von Funktionen zugeordnet werden, die einer bestimmten zugeordnet sind .h Datei und isoliert mit Funktionen, mit denen Sie die Variable ändern können, ohne etwas zu beschädigen.

Anstatt zu sagen “verwenden Sie niemals globale Variablen”, können Sie sagen “weisen Sie die Verantwortlichkeiten der globalen Variablen einem Modul zu, wo es am sinnvollsten ist”.

  • +1 – Bravo. Dies sind die Dinge, die die Menschen früher getan haben, bevor wir wussten, dass globale Variablen so “böse” sind. Erschreckenderweise funktionierten diese alten Programme immer noch und waren oft noch wartbar. 🙂

    – Torlack

    6. Oktober 2008 um 22:20 Uhr

Betrachten Sie diesen Koan: “Wenn der Geltungsbereich eng genug ist, ist alles global”.

In der heutigen Zeit ist es immer noch sehr wahrscheinlich, dass Sie ein sehr schnelles Dienstprogramm schreiben müssen, um eine einmalige Aufgabe zu erledigen.

In solchen Fällen ist die Energie, die erforderlich ist, um einen sicheren Zugriff auf Variablen zu schaffen, größer als die Energie, die durch das Debuggen von Problemen in einem so kleinen Dienstprogramm eingespart wird.

Dies ist der einzige Fall, der mir auf Anhieb einfällt, in dem globale Variablen sinnvoll sind, und er ist relativ selten. Nützliche, neuartige Programme, die so klein sind, dass sie vollständig im Kurzzeitgedächtnis des Gehirns gespeichert werden können, werden immer seltener, aber es gibt sie immer noch.

Tatsächlich könnte ich kühn behaupten, dass globale Variablen illegal sein sollten, wenn das Programm nicht so klein ist.

  • Wenn sich die Variable nie ändert, dann ist sie eine Konstante, keine Variable.
  • Wenn die Variable universellen Zugriff erfordert, sollten zwei Subroutinen zum Abrufen und Setzen vorhanden sein, und sie sollten synchronisiert werden.
  • Wenn das Programm klein anfängt und später vielleicht größer wird, dann codieren Sie so, als ob das Programm heute groß wäre, und globale Variablen abschaffen. Nicht alle Programme wachsen! (Obwohl das natürlich davon ausgeht, dass der Programmierer bereit ist, manchmal Code wegzuwerfen.)

Globale Variablen in C sind nützlich, um Code lesbarer zu machen, wenn eine Variable von mehreren Methoden benötigt wird (anstatt die Variable an jede Methode zu übergeben). Sie sind jedoch gefährlich, da alle Standorte die Möglichkeit haben, diese Variable zu ändern, was es möglicherweise schwierig macht, Fehler aufzuspüren. Wenn Sie eine globale Variable verwenden müssen, stellen Sie immer sicher, dass sie nur direkt von einer Methode geändert wird, und lassen Sie alle anderen Aufrufer diese Methode verwenden. Dadurch wird es viel einfacher, Probleme im Zusammenhang mit Änderungen in dieser Variablen zu debuggen.

Wenn Sie sich keine Gedanken über Thread-sicheren Code machen: Verwenden Sie sie, wo immer es sinnvoll ist, also überall dort, wo es sinnvoll ist, etwas als globalen Zustand auszudrücken.

Wenn Ihr Code möglicherweise Multithreading enthält: um jeden Preis vermeiden. Abstrahieren Sie globale Variablen in Arbeitswarteschlangen oder eine andere Thread-sichere Struktur oder packen Sie sie, wenn es absolut notwendig ist, in Sperren, wobei Sie bedenken, dass dies wahrscheinlich Engpässe im Programm sind.

Benutzeravatar von gthuffman
gtuffman

Ich kam aus dem „Nie“-Lager, bis ich anfing, in der Verteidigungsindustrie zu arbeiten. Es gibt einige Industriestandards, die erfordern, dass Software globale Variablen anstelle von dynamischem Speicher (malloc im C-Fall) verwendet. Ich muss meinen Ansatz zur dynamischen Speicherzuweisung für einige der Projekte, an denen ich arbeite, überdenken. Wenn Sie den “globalen” Speicher mit den geeigneten Semaphoren, Threads usw. schützen können, kann dies ein akzeptabler Ansatz für Ihre Speicherverwaltung sein.

Die Codekomplexität ist nicht die einzige Optimierung, die Anlass zur Sorge gibt. Für viele Anwendungen hat die Performance-Optimierung eine weitaus höhere Priorität. Aber noch wichtiger ist, dass die Verwendung globaler Variablen die Codekomplexität in vielen Situationen drastisch REDUZIEREN kann. Es gibt viele, vielleicht spezialisierte Situationen, in denen globale Variablen nicht nur eine akzeptable Lösung, sondern eine bevorzugte sind. Mein bevorzugtes spezialisiertes Beispiel ist ihre Verwendung, um die Kommunikation zwischen dem Haupt-Thread einer Anwendung mit einer Audio-Callback-Funktion bereitzustellen, die in einem Echtzeit-Thread ausgeführt wird.

Es ist irreführend anzunehmen, dass globale Variablen in Multithread-Anwendungen eine Belastung darstellen, da JEDE Variable, unabhängig vom Bereich, eine potenzielle Belastung darstellt, wenn sie Änderungen in mehr als einem Thread ausgesetzt ist.

Gehen Sie sparsam mit globalen Variablen um. Wann immer möglich, sollten Datenstrukturen verwendet werden, um die Verwendung des globalen Namensraums zu organisieren und zu isolieren.

Der variable Geltungsbereich bietet Programmierern einen sehr nützlichen Schutz – aber er kann seinen Preis haben. Ich bin heute Abend gekommen, um über globale Variablen zu schreiben, weil ich ein erfahrener Objective-C-Programmierer bin, der oft frustriert über die Barrieren ist, die die Objektorientierung beim Datenzugriff auferlegt. Ich würde argumentieren, dass der antiglobale Fanatismus hauptsächlich von jüngeren, theoriebegeisterten Programmierern stammt, die hauptsächlich isoliert mit objektorientierten APIs vertraut sind, ohne eine tiefe, praktische Erfahrung mit APIs auf Systemebene und ihrer Interaktion in der Anwendungsentwicklung. Aber ich muss zugeben, dass ich frustriert bin, wenn Anbieter den Namensraum schlampig verwenden. Mehrere Linux-Distributionen hatten beispielsweise “PI” und “TWOPI” global vordefiniert, was einen Großteil meines persönlichen Codes zerstörte.

1413380cookie-checkWann ist es in Ordnung, eine globale Variable in C zu verwenden?

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

Privacy policy