Frage

Ich verwende C (nicht C ++) und bin mir nicht sicher, wie ich die Verwendung globaler Variablen vermeiden soll.

Ich habe ein ziemlich gutes Verständnis für C, seine Syntax und das Schreiben einer Basisanwendung, bin mir aber nicht sicher, wie das Programm richtig strukturiert werden soll.

Wie vermeiden wirklich große Anwendungen die Verwendung globaler Variablen?Ich bin mir ziemlich sicher, dass es immer mindestens einige geben muss, aber für große Spiele und andere in C geschriebene Anwendungen, was ist der beste Weg, dies zu tun?

Gibt es eine gute Open-Source-Software, die ausschließlich in C geschrieben ist und die ich mir ansehen könnte?Ich kann mir keine aus dem Kopf denken, die meisten von ihnen scheinen in C ++ zu sein.

Danke.

Bearbeiten

Hier ist ein Beispiel dafür, wo ich eine globale Variable in einer einfachen API-Hooking-Anwendung verwenden würde, die nur eine DLL in einem anderen Prozess ist.

Diese Anwendung bindet insbesondere API-Funktionen ein, die in einer anderen Anwendung verwendet werden.Dazu wird WriteProcessMemory verwendet, um den Aufruf des Originals zu überschreiben und stattdessen meine DLL aufzurufen.

Wann jedoch unwenn ich die API-Funktion einhänge, muss ich den ursprünglichen Speicher- / Maschinencode zurückschreiben.

Also muss ich ein einfaches Byte-Array für diesen Maschinencode pflegen, eines für jede API-Funktion, die angeschlossen ist, und es gibt eine Menge.

// Global variable to store original assembly code (6 bytes)
BYTE g_MessageBoxA[6];

// Hook the API function
HookAPIFunction ( "user32.dll", "MessageBoxA", MyNewFunction, g_MessageBoxA );

// Later on, unhook the function
UnHookAPIFunction ( "user32.dll", "MessageBoxA", g_MessageBoxA );

Entschuldigung, wenn das verwirrend ist.

War es hilfreich?

Lösung

"Wie vermeiden wirklich große Anwendungen die Verwendung globaler Variablen?"

  1. Verwenden Sie statische Variablen.Wenn sich eine Funktion zwischen Aufrufen etwas merken muss, verwenden Sie dies im Vergleich zu globalen Variablen.Beispiel:

    int running_total (int num) {
        static int sum  = 0;
        sum             += num;
        return sum;
    }
    
  2. Übergeben Sie Daten über Parameter, so dass der Wert möglicherweise an einer Stelle definiert ist main() und dorthin weitergegeben, wo es gebraucht wird.

  3. Wenn alles andere fehlschlägt, verwenden Sie ein globales, aber versuchen Sie, potenzielle Probleme zu mindern.

    1. Verwenden Sie mindestens Namenskonventionen, um potenzielle Konflikte zu minimieren.Z: Gbl_MyApp_DeveloperName.Also würden alle globalen Variablen mit dem beginnen Gbl_MyApp_ teil - wobei "MyApp" etwas Beschreibendes für Ihre App war.
    2. Versuchen Sie, Funktionen nach Zweck zu gruppieren, sodass sich alles, was ein bestimmtes Global benötigt, in derselben Datei befindet (im Rahmen des Zumutbaren).Dann können Globals definiert und auf diese Datei beschränkt werden (Vorsicht vor dem extern Schlusselwort).

Andere Tipps

Es gibt einige gültige Anwendungen für globale Variablen.Die Schulen begannen zu unterrichten, dass sie böse waren, um Programmierer davon abzuhalten, sie faul zu sein und sie zu benutzen.Wenn Sie sicher sind, dass die Daten wirklich global benötigt werden, verwenden Sie sie.In Anbetracht dessen, dass Sie sich um einen guten Job machen, glaube ich nicht, dass Sie mit Ihrem eigenen Urteil zu weit gehen.

Es ist einfach - benutze sie einfach nicht.Erstellen Sie, was die globalen Variablen in Ihrer Haupt- () -Funktion von Ben hat, und geben Sie sie dann als Parameter an die Funktionen an, die sie benötigen.

Die am besten empfohlene Open-Source-Software, die C in meinem College lernen kann, war Linux, sodass Sie Beispiele aus ihrer Quelle erhalten können.

Ich denke das Gleiche, Globals sind schlecht, verringert die Lesbarkeit und erhöht die Fehlermöglichkeit und andere Probleme.

Ich werde mein Beispiel erklären.Ich habe ein Main () wirklich nur wenige Dinge.Das Beste der Aktion stammt von Timern und externen Interrupts.Diese sind Funktionen ohne Parameter, fällige Plattform, die ich verwende, 32 Bit Micro Controller.Ich kann die Parameter nicht weitergeben und zusätzlich sind diese Interrupts und Timer asynchron.Der einfachste Weg ist ein globaler, vorstellbarer Unterbrecher, der einen Puffer füllt, dieser Puffer wird in einem Timer analysiert, und die Analyse von Informationen werden verwendet, gespeichert, in anderen Timern gesendet. OK, ich kann ein Interrupt-Flag und einen Prozess in der Hauptfunktion hochziehen, aber wenn Sie kritische Software ausführen, ist diese Weise keine gute Idee.

Dies ist die einzige Art von globaler Variablen, die mich nicht schlecht fühlt; -)

globale Variablen sind fast unvermeidlich.Sie sind jedoch oft überschwemmt.Sie sind kein Ersatz, um die richtigen Parameter vorzunehmen und die richtigen Datenstrukturen zu entwerfen.

Jedes Mal, wenn Sie eine globale Variable möchten, denken Sie an: Was ist, wenn ich noch etwas brauche?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top