diff options
author | Tobias Klauser <tklauser@distanz.ch> | 2008-01-27 11:37:44 +0100 |
---|---|---|
committer | Tobias Klauser <tklauser@xenon.tklauser.home> | 2008-01-27 11:37:44 +0100 |
commit | 7e0f021a9aec35fd8e6725e87e3313b101d26f5e (patch) | |
tree | b1cacc4b24393f517aeb4610e9e1021f954307a8 /reference/C/SYNTAX/storage_class.html |
Initial import (2.0.2-6)2.0.2-6
Diffstat (limited to 'reference/C/SYNTAX/storage_class.html')
-rw-r--r-- | reference/C/SYNTAX/storage_class.html | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/reference/C/SYNTAX/storage_class.html b/reference/C/SYNTAX/storage_class.html new file mode 100644 index 0000000..c12cbc8 --- /dev/null +++ b/reference/C/SYNTAX/storage_class.html @@ -0,0 +1,187 @@ +<title>C Storage Classes</title> +<head> +<script language="JavaScript"> +</script> +</head> + +<body bgcolor="#ffffcc"> +<center> +<hr> +<h1>C Storage Classes.</h1> +<hr> +</center> +<p> +C has a concept of '<i>Storage classes</i>' which are used to define the +scope (visability) and life time of variables and/or functions. +<p> +So what Storage Classes are available? +<p> +<table border=2 bgcolor=ivory> +<tr> +<td><a href="#auto">auto</a> +<td><a href="#register">register</a> +<td><a href="#static">static</a> +<td><a href="#extern">extern</a> +<td><A HREF="../SYNTAX/typedef.html">typedef</A> +</tr> +</table> +<p> +<hr> +<h2><a name="auto">auto - storage class</h2> +<b>auto</b> is the default storage class for local variables. +<pre> + { + int Count; + auto int Month; + } +</pre> + +The example above defines two variables with the same storage class. +auto can only be used within functions, i.e. local variables. <p> +<hr> +<h2><a name="register">register - Storage Class</h2> +<b>register</b> is used to define local variables that should be stored +in a register instead of RAM. This means that the variable has a maximum size +equal to the register size (usually one word) and cant have the unary '&' +operator applied to it (as it does not have a memory location). +<pre> + { + register int Miles; + } +</pre> +Register should only be used for variables that require quick access - such +as counters. It should also be noted that defining 'register' goes not mean +that the variable will be stored in a register. It means that it MIGHT be stored +in a register - depending on hardware and implimentation restrictions.<p> +<hr> +<h2><a name="static">static - Storage Class</h2> +<b>static</b> is the default storage class for global variables. The two +variables below (count and road) both have a static storage class. +<pre> + static int Count; + int Road; + + { + printf("%d\n", Road); + } +</pre> +static variables can be 'seen' within all functions in this source file. At +link time, the static variables defined here will not be seen by the object +modules that are brought in.<p> +'static' can also be defined within a function! If this is done the variable +is initalised at run time but is not reinitalized when the function is called. +This is serious stuff - tread with care. + +<pre> + { + static Count=1; + } +</pre> +Here is an <a href="../EXAMPLES/static.c">example</a><p> + +<a name="static2"> +There is one very important use for 'static'. Consider this bit of code. +<pre> + char *func(void); + + main() + { + char *Text1; + Text1 = func(); + } + + char *func(void) + { + char Text2[10]="martin"; + return(Text2); + } +</pre> + +Now, 'func' returns a pointer to the memory location where 'text2' starts +BUT text2 has a storage class of 'auto' and will disappear when we exit the +function and could be overwritten but something else. The answer is to specify +<pre> + static char Text[10]="martin"; +</pre> +The storage assigned to 'text2' will remain reserved for the duration if the +program. +<p> +<hr> +<font color=brown> +C++ has overloaded static, <a href="../../CPLUSPLUS/SYNTAX/static.htm">here +are the details.</a> +</font> +<hr> +<h2><a name="extern">extern - storage Class</h2> +<b>extern</b> defines a global variable that is visable to ALL object +modules. When you use 'extern' the variable cannot be initalized as +all it does is point the variable name at a storage location that has +been previously defined. + +<table border=2 width="80%" bgcolor="ivory"> +<th align=center> +Source 1 +</th> +<th> +Source 2 +</th> +<tr> +<td> +<pre> + +extern int count; int count=5; + +write() main() +{ { + printf("count is %d\n", count); write(); +} } +</pre> +</td> +<td> +test +</td> +</tr> +</table> + +Count in 'source 1' will have a value of 5. If source 1 changes the +value of count - source 2 will see the new value. Here are some example +source files. +<p> +<a href="../EXAMPLES/extern1.c">Source 1</a><br> +<a href="../EXAMPLES/extern2.c">Source 2</a><p> + +The compile command will look something like.<p> +<pre> + gcc source1.c source2.c -o program +</pre> + +<hr> +<h2>See Also:</h2> +<a href="../CONCEPT/data_types.html">Data types.</a> + + +<p> + +<hr> +<p> +<center> +<table border=2 width="80%" bgcolor="ivory"> +<tr align=center> +<td width="25%"> +<a href="../cref.html"> Top</a> +</td><td width="25%"> +<a href="../master_index.html"> Master Index</a> +</td><td width="25%"> +<a href="keywords.html"> Keywords</a> +</td><td width="25%"> +<a href="../FUNCTIONS/funcref.htm"> Functions</a> +</td> +</tr> +</table> +</center> +<p> +<hr> +<address>Martin Leslie +</address><p> +</body> +</html> |