Was ist die beste Strategie für die Freigabe von Variablen zwischen Quelldateien in c / c ++?

8

Ich muss häufig c / c ++ - Programme mit mehr als 10 Quelldateien schreiben, wobei eine Handvoll Variablen zwischen den Funktionen in allen Dateien aufgeteilt werden muss. Ich habe zuvor gelesen, dass es allgemein üblich ist, globale Variablen mit extern zu vermeiden. Wenn es jedoch vollständig erforderlich ist, globale Variablen zu verwenden, bietet dieser Link eine gute Strategie. In letzter Zeit habe ich mit der Strategie gespielt, alle meine Variablen in einer Struktur oder einer Klasse zusammenzufassen und diese Struktur an verschiedene Funktionen weiterzugeben. Ich habe mich gefragt, welchen Weg die Leute für sauberer halten und ob es bessere Alternativen gibt.

EDIT: Ich realisiere, dass die Strategien in beiden Sprachen unterschiedlich sein können. Ich interessiere mich für Strategien, die nur für eine oder beide Sprachen gelten.

    
baconeer 01.08.2013, 15:39
quelle

5 Antworten

4

Übergeben Sie eine Klasse / Struktur von "Kontext" -Daten anstelle von globalen Variablen. Sie werden überrascht sein, wie oft eine globale Variable nicht mehr global wird, während verschiedene Module gleichzeitig verschiedene Werte dafür verwenden möchten.

    
Neil Kirk 01.08.2013 15:48
quelle
3

Die bessere Alternative zu Globalen ist, keine Globals zu verwenden.

Versuche nicht, sie unter den Teppich zu kehren, indem du eine Struktur oder einen Namensraum oder ein Singleton oder eine andere dumme Sache verwendest, deren einziger Zweck es ist, die Tatsache zu verbergen, dass du Globals verwendest.

Erstelle einfach niemals einen. Immer.

Es wird Sie zwingen, an Besitz und Leben und Abhängigkeiten und Verantwortung zu denken. Weißt du, erwachsene Dinge.

Und wenn Sie sich darüber freuen, global-freien Code zu schreiben, können Sie anfangen, gegen all diese Regeln zu verstoßen.
Denn das ist es, wofür Regeln zu befolgen und zu brechen sind.

    
molbdnilo 01.08.2013 16:07
quelle
2

Ich nehme C ++

Ich fand es trotzdem eine gute Übung in C++ , den Umfang meiner globalen Variablen mit einem namespace zu begrenzen. Auf diese Weise können Sie Unklarheiten zwischen Ihren 10+ Quelldateien beseitigen.

Zum Beispiel:

%Vor%     
Kirk Backus 01.08.2013 15:46
quelle
2

Muss es wirklich global sein?

Dies ist die erste Frage, die Sie immer stellen sollten, ist diese Variable GLOBAL z. in allen Kontexten. Die Antwort ist fast sicher ... nein ist es nicht .

Betrachte Kontext

Ist der globale Status der Variablen oder ist es Kontext? Der globale Zustand ist in der Regel selten, der Kontext dagegen ist ziemlich verbreitet. Wenn es sich um einen globalen Status handelt, sollten Sie das Wrapping in einem Singleton in Erwägung ziehen, damit Sie die wie der Interaktion mit Ihren Globals verwalten können. Die Verwendung von Atomic<> ist wahrscheinlich keine schlechte Idee, Sie sollten zumindest die Synchronisation in Betracht ziehen.

Wenn es Kontext ist, sollte es explizit in einer Struktur oder Klasse übergeben werden, da die Daten für diesen Kontext explizit relevant sind. Das explizite Übergeben von Kontexten mag wie eine Last erscheinen, aber es macht sehr deutlich, wo der Kontext herkommt, anstatt nur auf zufällige Variablen außerhalb des Ethers zu verweisen.

Was ist der Umfang?

Es mag seltsam erscheinen zu sagen, dass Globals im Bereich liegen, aber jedes globale deklarierte in einer einzigen Datei kann als static deklariert werden und somit von jeder anderen Datei nicht verlinkt werden. Dies bedeutet, dass Sie einschränken können, wer Zugriff auf den globalen Status in einem bestimmten Bereich hat. Auf diese Weise können Sie verhindern, dass Personen Variablen zufällig manipulieren.

    
Mgetz 01.08.2013 15:57
quelle
1

In c ++
Globale Variablen, die hier und da herumliegen, sind ein Beispiel für schlechten Code .
Wenn Sie Dinge auf globaler Ebene teilen möchten, gruppieren Sie sie und folgen Sie dem Singleton-Muster.

Beispiel:

%Vor%
  

Vorteile:

     
  • Nur 1 globale Variable. Die Instanz unseres Singleton.

  •   
  • Sie können Mutex- / Semaphore-Mechanismen in den Singleton integrieren, um thread-safe auf die Mitglieder zuzugreifen.

  •   
  • Schränkt den Zugriff seiner Mitglieder ein und hilft Ihnen, logische und Synchronisierungsfehler zu vermeiden.
  •   

Nachteile:

     
  • Schwieriger zu implementieren. - Wenn es dein erstes Mal ist -
  •   



In c
Sie sollten es vermeiden, globale Variablen zu deklarieren, sondern sie stattdessen in Strukturen übergeben.

Zum Beispiel:

%Vor%



Um die Dinge zusammenzufassen
Globale Variablen, die herumliegen, sollten in beiden Sprachen so weit wie möglich vermieden werden.

    
gifnoc-gkp 01.08.2013 15:47
quelle

Tags und Links