[Icc-avr] Are 'local' vars in main automatuc or in bss?
Jaspers, Ton
t.jaspers at cpseurope.com
Fri Oct 26 01:51:24 PDT 2007
Hear, hear!
This is exactly the stuff I use in the selection process of new
colleagues.
Ton
> -----Original Message-----
> From: icc-avr-bounces at imagecraft.com
> [mailto:icc-avr-bounces at imagecraft.com] On Behalf Of David Brown
> Sent: vrijdag 26 oktober 2007 10:28
> To: Discussion list for ICCAVR and ICCtiny Users. You do NOT
> need to subscribe to icc-announce if you are a member of this.
> Subject: Re: [Icc-avr] Are 'local' vars in main automatuc or in bss?
>
> Graham Whyte wrote:
> > main() is no different from any other subroutine except
> that it gets
> > called at startup
> >
> > Variables declared outside subroutines or functions in any
> module file
> > are Global within that module The can be referenced from anywhere
> > within that module
>
> Correct up to here...
>
> > To make them Global to other modules, each other module needs to
> > declare then as External
>
> That's wrong, and very misleading.
>
> Variables (and functions) get global linkage if they are
> defined at file scope without "static" - C defaults to making
> them global and externally accessible. Thus two "int x;"
> definitions at file scope in two modules refer to the same
> variable at the same address, regardless of any "extern" declarations.
>
> The point of "extern" is to tell the compiler about a global
> variable (or function) without defining it - it allows access
> to a global variable, but does not turn a variable into a global one.
>
> > This is exactly the same as making a subroutine available to other
> > modules The declarations must of course be identical
> >
>
> The declaration *should* be identical - but be careful,
> because C allows you to get it completely wrong and still be legal C.
>
> > You can make this very neat and tidy by putting the Globals in a
> > separate module Then create the external declarations in a
> separate
> > header file which you can #include wherever you need You
> then only got
> > one copy to worry about
>
> I've seen programs made like this - as Ton says, "Yuck!".
>
> If you want to write programs that are readable,
> understandable, debugable and maintainable, and allow for at
> least some level of re-use between programs, then you will
> avoid this setup like the plague.
>
> Modularisation is critical to writing software. Break your
> program into parts that fit logically together, and figure
> out what data and functions (and types, macros, etc.) that
> module makes available to other parts of the whole program.
> This information is your module's interface, or API, and
> forms its "module.h" header file.
>
> The header file "module.h" contains comments about how to use
> the module, along with all type declarations, #define's, "extern"
> declarations of data and functions, and any #include's that
> are needed to *use* the module (for example, if it contains a
> line "extern uint8_t count;", then it should also contain a
> line "#include <stdint.h>" or equivalent).
>
> The C file "module.c" contains the *implementation* of the
> module, and has #include "module." near the beginning. Every
> file-scope variable or function is either private to the
> module, and defined "static", *or* it has a corresponding
> "extern" declaration in "module.h". There should be no
> exceptions (except perhaps temporarily to aid debugging,
> since you can see non-static items in the map file).
>
>
> As I said in an earlier post, I tend to rant a bit and treat
> my methods as the only correct methods, but in this case
> there is no real doubt.
> If you look at any other properly structured programming
> language, such as Pascal, Modula 2, or Ada, you'll see that
> this is exactly the way good modular programming is always
> done - other languages enforce these rules.
>
> mvh.,
>
> David
>
>
> >
> > Graham
> >
> > -----Original Message-----
> > *From:* icc-avr-bounces at imagecraft.com
> > [mailto:icc-avr-bounces at imagecraft.com]*On Behalf Of
> > *bobgardner at aol.com
> > *Sent:* 25 October 2007 14:30
> > *To:* icc-avr at imagecraft.com
> > *Subject:* [Icc-avr] Are 'local' vars in main automatuc or in bss?
> >
> > Great summary of 'static' vars.... I remember in pascal the scope
> > 'nested' and stuff 'up a level' was visible, but c doesnt
> allow nested
> > functions I guess. Just to clarify, if I declare vars in main, are
> > they local or in the bss? Is main a subroutine that is called with
> > params and returns a value? Is the iccavr microcontroller model
> > different from a ram based system with an os?
> >
> ----------------------------------------------------------------------
> > -- Email and AIM finally together. You've gotta check out free AOL
> > Mail
> >
> <http://o.aolcdn.com/cdn.webmail.aol.com/mailtour/aol/en-us/in
dex.htm?ncid=AOLAOF00020000000970>!
> >
> >
> >
> ----------------------------------------------------------------------
> > --
> >
> > _______________________________________________
> > Icc-avr mailing list
> > Icc-avr at imagecraft.com
> > http://dragonsgate.net/mailman/listinfo/icc-avr
>
> _______________________________________________
> Icc-avr mailing list
> Icc-avr at imagecraft.com
> http://dragonsgate.net/mailman/listinfo/icc-avr
>
More information about the Icc-avr
mailing list