2010-07-08 15 views
6

Ich benutze C (nicht C++) und bin unsicher, wie man die Verwendung globaler Variablen vermeidet.C - Programmstruktur (Vermeiden von globalen Variablen, Includes usw.)

Ich habe einen ziemlich guten Zugriff auf C, seine Syntax und wie man eine grundlegende Anwendung schreibt, aber ich bin mir nicht sicher über die richtige Art, das Programm zu strukturieren.

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

Gibt es eine gute Open-Source-Software, die ausschließlich in C geschrieben ist und die ich mir ansehen kann? Ich kann mir nichts Kopfrechnen vorstellen, die meisten scheinen in C++ zu sein.

Danke.

bearbeiten

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

Diese Anwendung hakt API-Funktionen, die in einer anderen Anwendung verwandt werden. Dies geschieht, indem WriteProcessMemory den Aufruf des Originals überschreibt und stattdessen einen Aufruf an meine DLL aufruft.

Wenn jedoch un die API-Funktion hooking, muss ich den ursprünglichen Speicher/Maschinencode zurückschreiben.

Also, ich muss ein einfaches Byte-Array für diesen Maschinencode, eine für jede API-Funktion, die süchtig 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.

+1

Können Sie ein konkretes Beispiel geben? Wofür brauchen Sie möglicherweise eine globale Variable? In 99% der Fälle ist es nicht notwendig global zu sein. –

Antwort

7

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

  1. Verwenden statische Variablen. Wenn eine Funktion sich zwischen zwei Aufrufen an etwas erinnern muss, verwenden Sie diese gegen globale Variablen.Beispiel:

    int running_total (int num) { 
        static int sum = 0; 
        sum    += num; 
        return sum; 
    } 
    
  2. Pass Daten über Parameter, so dass der Wert einer Stelle definiert ist, vielleicht main() und weitergegeben, wo sie benötigt wird.

  3. Wenn alles andere fehlschlägt, gehen Sie voran und verwenden Sie eine globale, aber versuchen Sie, potenzielle Probleme zu mildern.

    1. Verwenden Sie mindestens die Namenskonventionen, um mögliche Konflikte zu minimieren. ZB: Gbl_MyApp_DeveloperName. Also würden alle globalen Variablen mit dem Gbl_MyApp_ Teil beginnen - wo "MyApp" etwas beschreibend für Ihre App war.
    2. Versuchen Sie, Funktionen nach Zweck zu gruppieren, so dass alles, was eine bestimmte globale benötigt, in der gleichen Datei (im Rahmen des Zumutbaren) ist. Dann können Globals definiert und auf diese Datei beschränkt werden (achten Sie auf das Schlüsselwort extern).
+2

Es scheint, dass statische Variablen in verschiedenen Dateien viel schwieriger zu verfolgen sind als eine globale Variable, die mit etwas vorangestellt ist, in einer einzigen Datei globals.h. –

+0

Eine Methode, die ich verwende, ist, dass jedes Modul eine Struktur hat, die in der Funktion main() deklariert wird. Dann wird ein Zeiger auf diese Struktur an die Funktion Init() der Module und jede andere Modulfunktion übergeben. Diese Struktur enthält alle im Modul verwendeten Variablen. Dies ist ein Ansatz und es gibt Vor- und Nachteile. Ein Vorteil ist, dass ein Modul einfach auf verschiedene Arten verwendet werden kann. Beispielsweise könnte ein Regelkreismodul dazu verwendet werden, mehrere Regelkreise auf diese Weise zu steuern. – Seidleroni

1

Die am besten empfohlene Open-Source-Software zum Erlernen von C in meiner Hochschule war Linux, so dass Sie Beispiele aus ihrer Quelle erhalten können.

2

Es gibt einige gültige Verwendungen für globale Variablen. Die Schulen fingen an zu lehren, dass sie böse waren, um Programmierer davon abzuhalten, faul zu sein und sie zu benutzen. Wenn Sie sicher sind, dass die Daten wirklich global benötigt werden, verwenden Sie sie. Da Sie sich Sorgen machen, dass Sie gute Arbeit leisten, glaube ich nicht, dass Sie mit Ihrem eigenen Urteil zu weit gehen.

0

Globale Variablen sind fast unvermeidlich. Sie werden jedoch oft überstrapaziert. Sie sind kein Ersatz für das Übergeben geeigneter Parameter und das Entwerfen der richtigen Datenstrukturen.

Jedes Mal, wenn Sie eine globale Variable wollen, denken Sie: Was ist, wenn ich eine weitere so brauche?

+1

Haben Sie ein konkretes Beispiel für eine "unvermeidbare" globale Variable? – Secure

2

Es ist einfach - einfach nicht benutzen. Erstellen Sie, was die globalen Variablen in Ihrer main() - Funktion hätte, und übergeben Sie sie dann als Parameter an die Funktionen, die sie benötigen.

+1

Ich wollte "Kavalier" sein - wenn es schwierig ist, sollten die Daten fast sicher nicht global sein. –

0

denke ich, das gleiche, Globals schlecht ist, reduziert die Lesbarkeit und erhöht die Fehlerwahrscheinlichkeit und andere Probleme.

Ich werde mein Beispiel erklären. Ich habe ein Haupt() wirklich wenige Dinge zu tun. Die meiste Aktion kommt von Timern und externen Interrupts. Dies sind Funktionen ohne Parameter, aufgrund der Plattform, die ich verwende, 32-Bit-Mikrocontroller. Ich kann keine Parameter übergeben und diese Interrupts und Timer sind außerdem asynchron. Der einfachste Weg ist ein globales, imagine, unterbricht das Füllen eines Puffers, dieser Puffer wird innerhalb eines Timers geparst und die geparste Information wird benutzt, gespeichert, in anderen Timern gesendet. Ok, ich kann ein Interrupt-Flag hochziehen und in der Hauptfunktion verarbeiten, aber wenn kritische Software ausgeführt wird, ist das keine gute Idee.

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

Verwandte Themen