SV: SV: [Icc-avr] Module globals static?

Bengt Ragnemalm benra at imt.liu.se
Wed Oct 24 23:50:40 PDT 2007


David, you are just extraordinary. Thanks for your great efforts to
educating me, I have really learned something today.

Thanks a lot,
Bengt

> -----Ursprungligt meddelande-----
> Från: David Brown [mailto:david_brown at hotpop.com]
> Skickat: den 24 oktober 2007 16:30
> Till: benra at imt.liu.se; Discussion list for ICCAVR and ICCtiny Users. You
> do NOT need to subscribe to icc-announce if you are a member of this.
> Ämne: Re: SV: [Icc-avr] Module globals static?
> 
> Bengt Ragnemalm wrote:
> > Do you mean that there is a difference between declaring a global
> variable
> > with and without the static operand?
> >
> 
> Yes - this is C programming basics.  If you don't know this stuff, you
> should be reading a good C programming book (or at least some web
> tutorials).
> 
> > Is there in this matter any difference in a global variable defined in
> the
> > same file as main and a global variable in another file? (I call these
> > module global). I know that a variable that is defined global in another
> > file will only be seen by functions in that file.
> >
> 
> A variable that can only be seen in the file in which it is defined is,
> by definition, not a global variable.  It is a file-local variable, and
> you achieve this by defining it as "static".
> 
> > The way you write make me think that if I write static to a file global
> > variable will not make it totally global but not static will.
> >
> 
> That's a slightly confusing sentence - but if I've interpreted it
> correctly, then you are correct.
> 
> There are two separate concepts to consider here.  There is the lifetime
> of the variables, and there is the visibility (or "scope") of the
> symbols for accessing the data.  It is also important to understand the
> difference between a "definition" and a "declaration".  Let's first look
> at the three choices for lifetimes for variables:
> 
> 1) Local variables.  These are allocated on the run-time stack, in
> registers, or may even be optimised away by the compiler.  They are
> defined locally in a function, without "static".  They are not
> initialised by default, and they disappear when they go out of scope.
> 
> 2) Statically allocated variables.  These have a specific memory
> address, and exist from just before main() begins.  They can be either
> explicitly initialised, or will default to 0.  They are defined at file
> scope (with or without "static") or as function-local "static" variables.
> 
> 3) Heap allocated data.  This is data allocated using malloc/free (or a
> similar dynamic memory system).  They exist from when they are
> malloc'ed, until they are free'ed.  These are not directly accessible,
> but must be accessed through pointers of some kind.
> 
> 
> For scope, you can have local scope (inside a function, or a block
> within a function - regardless of "static" modifiers), file scope
> (file-level definitions with "static") and global scope (file-level
> definitions without "static", or "extern" declarations).  It is good
> programming practice to always use the smallest possible scope for your
> data and functions.
> 
> 
> A "definition" says what a variable or function is, and causes the
> compiler to allocate memory for storage.  A "declaration" merely tells
> the compiler about the variable (or function), but does not allocate any
> memory.  In particular, "extern" statements are declarations but not
> definitions, while all definitions are also declarations.  Every item of
> data should have a single definition within the program.  Global data
> will also need an "extern" declaration to be accessible from other
> modules.  The only sane way to handle this is that for any module
> "module.c", every function and variable is either declared "static"
> (which should be the default, but the C language designers were lazy),
> or has a corresponding "extern" declaration in "module.h".  The file
> "module.c", and every module that needs access to module's globals, must
> have #include "module.h".
> 
> 
> Does that terse summary help?
> 
> mvh.,
> 
> David
> 
> 
> 
> 
> > /Bengt
> >
> >> -----Ursprungligt meddelande-----
> >> Från: icc-avr-bounces at imagecraft.com [mailto:icc-avr-
> >> bounces at imagecraft.com] För David Brown
> >> Skickat: den 24 oktober 2007 11:45
> >> Till: Discussion list for ICCAVR and ICCtiny Users. You do NOT need
> >> tosubscribe to icc-announce if you are a member of this.
> >> Ämne: Re: [Icc-avr] Module globals static?
> >>
> >> Bengt Ragnemalm wrote:
> >>> Is a variable that is global in a module also automatically static? I
> >>> think it is but if so, shouldn’t the strictly most correct way to
> define
> >>> the globals also be as static?
> >>>
> >>>
> >> Yes, global variables are statically allocated, meaning they have a
> >> fixed address in memory (assigned by the linker) and exist throughout
> >> the lifetime of the program.
> >>
> >> You can think of the keyword "static" as having two distinct effects on
> >> variables - it ensures that they have a statically allocated address,
> >> and it ensures that they have the minimum possible scope.  Thus all
> >> file-level data and functions should be declared "static" unless you
> are
> >> specifically defining global data or functions that should be available
> >> from other files.
> >>
> >> mvh.,
> >>
> >> David
> >>




More information about the Icc-avr mailing list