C - la structure du programme (pour éviter les variables globales, comprend, etc.)
Je suis à l'aide de C (pas C++) et je n'en suis pas sûr pour éviter d'utiliser des variables globales.
J'ai un assez décent saisir sur C, sa syntaxe, et comment écrire une demande de base, mais je ne suis pas sûr de la bonne façon de structurer le programme.
Comment faire vraiment de grosses applications d'éviter l'utilisation de variables globales? Je suis assez sûr qu'il y aura toujours besoin d'être au moins pour certains, mais pour les gros jeux et d'autres applications écrites en C, quelle est la meilleure façon de le faire?
Est-il bon, le logiciel open-source écrit strictement en C que j'ai pu regarder? Je ne peux pas penser à tout en haut de ma tête, la plupart d'entre eux semblent être en C++.
Grâce.
Modifier
Voici un exemple de cas où je voudrais utiliser une variable globale dans une simple API hooking application, qui est juste une DLL à l'intérieur d'un autre processus.
Cette application, plus précisément, des crochets de fonctions de l'API utilisé dans une autre application. Il le fait en utilisant WriteProcessMemory de remplacer l'appel à l'original, et faire un appel de ma DLL.
Toutefois, lorsque de l'onuaccrochage de la fonction de l'API, j'ai à écrire de nouveau la mémoire d'origine/code machine.
Donc, j'ai besoin de maintenir un simple tableau d'octets pour que le code machine, une pour chaque fonction de l'API qui est accro, et il y en a beaucoup.
//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 );
Désolé si c'est confus.
- Pouvez-vous donner un exemple précis? Que pensez-vous que vous pouvez avoir besoin d'une variable globale pour? 99% du temps, il n'a pas besoin d'être global.
Vous devez vous connecter pour publier un commentaire.
Utilisation de variables statiques. Si une fonction doit se souvenir de quelque chose entre les appels, l'utilisation de ce rapport à des variables globales. Exemple:
Transmettre des données via les paramètres, de sorte que la valeur est définie en un seul endroit, peut-être
main()
et transmis à l'endroit où elle est nécessaire.Si tout le reste échoue, aller de l'avant et à l'utilisation d'un mondial, mais essayez et atténuer les problèmes potentiels.
Gbl_MyApp_DeveloperName
. Donc, toutes les variables globales serait de commencer avec laGbl_MyApp_
partie -- où "MyApp" était quelque chose de descriptif de votre application.extern
mot-clé).Il y a quelques valide utilise pour les variables globales. Les écoles ont commencé l'enseignement qu'ils ont du mal à garder les programmeurs d'être paresseux et sur leur utilisation. Si vous êtes sûr que les données sont vraiment à l'échelle mondiale nécessaire ensuite de les utiliser. Étant donné que vous êtes inquiet au sujet de faire un bon travail, je ne pense pas que vous allez trop loin de la vérité à l'aide de votre propre jugement.
Il est facile - il suffit de ne pas les utiliser. créer ce qui serait ben les variables globales dans votre fonction main (), puis à les transmettre à partir de là que les paramètres pour les fonctions qui en ont besoin.
Les mieux recommandés logiciel open-source pour apprendre C dans mon collège avait été Linux de sorte que vous pouvez obtenir des exemples de leur source.
Je pense la même chose, globales sont mauvais, réduit la lisibilité et augmente la possibilité d'erreur et d'autres problèmes.
Je vais vous expliquer mon exemple. J'ai un main() vraiment très peu de choses. La plupart de l'action vient de minuteries et des interruptions externes. Ces fonctions sans paramètre, en raison de la plate-forme que je suis en utilisant 32 bits de micro-contrôleur. Je ne peux pas passer des paramètres et en plus, ces interruptions et les minuteries sont asynchrones. Le plus simple est une mondial, l'imaginer, les interruptions de remplir la mémoire tampon, ce tampon est analysé à l'intérieur d'une minuterie et de l'information analysée est utilisé, stocké, envoyés dans d'autres compteurs.
Ok, j'ai peut tirer vers le haut un drapeau d'interruption et de processus dans la fonction principale, mais lors de l'exécution de logiciels critiques de cette façon n'est pas une bonne idée.
C'est le seul type de variable globale qui ne veut pas me faire du mal 😉
Variables globales sont presque inévitables. Cependant, ils sont souvent galvaudé. Ils ne sont pas un substitut pour le passage des paramètres appropriés, et de la conception du droit des structures de données.
Chaque fois que vous voulez une variable globale, pense: que faire si j'ai besoin d'un plus comme ça?