From: Mungo Henning <mungoh AT bigfoot DOT com> Newsgroups: comp.os.msdos.djgpp Subject: Re: Global variables and structs? Date: Thu, 17 Feb 2000 17:51:26 +0000 Organization: itacs Lines: 81 Message-ID: <38AC351D.6FF106D3@bigfoot.com> References: <sak249572pd170 AT corp DOT supernews DOT com> NNTP-Posting-Host: kite15.itacs.strath.ac.uk Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Mailer: Mozilla 4.5 [en] (WinNT; I) X-Accept-Language: en To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com "William J. Urban II" wrote: > Hello all, > Well I am in a C++ class and also teaching myself some simple 2d game > writing with allegro. Now, in class we learned about Global variables and > how we should use them sparingly. My question is why? In a large program there can be a significant stack of functions which call each other. For example, function A calls function B which calls function C and so on (say) down to function Z. Once the program has been established, it becomes obvious that a new bit of information which is needed in function Z is actually available in function A. So how do we get the data from A to Z? Arguably, the *best* solution is to modify functions B through Z to accept a new parameter. This gives a clean interface. But, wait a minute, functions B through Z are also called from many other places, so they too will have to donate the extra argument or the compiler will complain. So, since it is Friday afternoon when you are doing this change, the quick-fix is to copy the data into a global variable (in function A) then pick it up in function Z. Everything works fine and dandy: you don't understand the hassle that everyone talks about with global variables. Some time later you find out that function M wants to call function N twice, the first time as normal and the second time with a different piece of information which is stored in the global. So function M ends up creating a temporary of the same type as the global, copying the global there, overwriting the global, calling function N then copying the temporary back into the global. Phew, gotta stack up the global, change it then proceed then undo the damage. And then you find that under some circumstances a lower-down function does (say) a longjmp and by-passes the undoing stage... And then the mire of globals becomes visible. Trust your teacher: in a big project globals can be deadly! Unless rigorously managed, they can turn and gobble you up! :-) I teach my delegates a few rules regarding globals: 1) don't create any 2) If you have to, tomorrow or next week is fine 3) Put your name and the date beside the global (in a comment) so that the guilty party can be identified later and fired. 4) Use "static" as a default until the global's scope widens 5) Ensure that each global has a loooooong unambiguous name (no globals called "i", "j" or "k" else you gotta check all "for" loops) HTH Mungo P.S> I'm ignoring the "X-windows" idea of a structure pointer and a bit mask flag to help when adding new information. -- Mungo Henning - it's a daft name but it goes with the face... mungoh AT bigfoot DOT com http://www.itacs.strath.ac.uk/ I speak for me, not my employer.