DEFINES AND MACROS ARE AIDS TO CLEAR PROGRAMMING
Chapter 6 - Defines and Macros
DEFINES AND MACROS ARE AIDS TO CLEAR PROGRAMMING
Load and display the file named DEFINE.C for your first
look at some defines and macros. Notice the first four
lines 2 through 5 of the program, each starting with the
word "#define". This is the way all defines and macros are
defined. Before the actual compilation starts, the compiler
goes through a preprocessor pass to resolve all of the
defines. In the present case, it will find every place in
the program where the combination "START" is found and it
will simply replace it with the 0 since that is the
definition. The compiler itself will never see the word
"START", so as far as the compiler is concerned, the zeros
were always there. Note that if the word "START" appears in
a text string or a comment, it will be ignored and
unchanged.
It should be clear to you by now that putting the word
"START" in your program instead of the numeral 0 is only a
convenience to you and actually acts like a comment since
the word "START" helps you to understand what the zero is
used for.
In the case of a very small program, such as that
before you, it doesn't really matter what you use. If,
however, you had a 2000 line program before you with 27
references to the "START", it would be a completely
different matter. If you wanted to change all of the
"START"s in the program to a new number, it would be simple
to change the one #define, but difficult to find and change
all of the references to it manually, and possibly
disastrous if you missed one or two of the references.
In the same manner, the preprocessor will find all
occurrences of the word "ENDING" and change them to 9, then
the compiler will operate on the changed file with no
knowledge that "ENDING" ever existed.
It is a fairly common practice in C programming to use
all capital letters for a symbolic constant such as "START"
and "ENDING" and use all lower case letters for variable
names. You can use any method you choose since it is mostly
a matter of personal taste.
IS THIS REALLY USEFUL?
When we get to the chapters discussing input and
output, we will need an indicator to tell us when we reach
the end-of-file of an input file. Since different compilers
use different numerical values for this, although most use
either a zero or a minus 1, we will write the program with a
Page 43
Chapter 6 - Defines and Macros
"define" to define the EOF used by our particular compiler.
If at some later date, we change to a new compiler, it is a
simple matter to change this one "define" to fix the entire
program. In Turbo C, the EOF is defined in the STDIO.H file
on line 44. You can observe this for yourself by listing
this file.
WHAT IS A MACRO?
A macro is nothing more than another define, but since
it is capable of at least appearing to perform some logical
decisions or some math functions, it has a unique name.
Consider line 4 of the program on your screen for an example
of a macro. In this case, anytime the preprocessor finds
the word "MAX" followed by a group in parentheses, it
expects to find two terms in the parentheses and will do a
replacement of the terms into the second definition. Thus
the first term will replace every "A" in the second
definition and the second term will replace every "B" in the
second definition. When line 13 of the program is reached,
"index" will be substituted for every "A", and "count" will
be substituted for every "B". But this replaceing will not
take place in string literals or comments. Remembering the
cryptic construct we studied a couple of chapters ago will
reveal that "mx" will receive the maximum value of "index"
or "count".
In like manner, the "MIN" macro will result in "mn"
receiving the minimum value of "index" or "count". The
results are then printed out. There are a lot of seemingly
extra parentheses in the macro definition but they are not
extra, they are essential. We will discuss the extra
parentheses in our next program.
Compile and run DEFINE.C.
LETS LOOK AT A WRONG MACRO
Load the file named MACRO.C and display it on your
screen for a better look at a macro and its use. The second
line defines a macro named "WRONG" that appears to get the
cube of "A", and indeed it does in some cases, but it fails
miserably in others. The second macro named "CUBE" actually
does get the cube in all cases.
Consider the program itself where the CUBE of i+offset
is calculated. If i is 1, which it is the first time
through, then we will be looking for the cube of 1+5 = 6,
which will result in 216. When using "CUBE", we group the
values like this, (1+5)*(1+5)*(1+5) = 6*6*6 = 216. However,
when we use WRONG, we group them as 1+5*1+5*1+5 = 1+5+5+5 =
Page 44
Chapter 6 - Defines and Macros
16 which is a wrong answer. The parentheses are therefore
required to properly group the variables together. It
should be clear to you that either "CUBE" or "WRONG" would
arrive at a correct answer for a single term replacement
such as we did in the last program. The correct values of
the cube and the square of the numbers are printed out as
well as the wrong values for your inspection.
Inspection of line 24 will reveal that we are
evaluating "5*(i) + (i)" which is 6 if "i" is one, and in
the second case "5*((i) + (i))" which is 10 if "i' is one.
The parentheses around the entire expression assure that the
value will be evaluated correctly.
WHAT IS AN ENUMERATION VARIABLE?
Load and display the program named ENUM.C for an
example of how to use the "enum" type variable. Line 4
contains the first "enum" type variable named "result" which
is a variable which can take on any of the values contained
within the parentheses. Actually the variable "result" is
an "int" type variable but can be assigned any of the values
defined for it. The names within the parentheses are "int"
type constants and can be used anywhere it is legal to use
an "int" type constant. The constant "win" is assigned the
value of 0, "tie" the value 1, "bye" the value 2, etc.
In use, the variable "result" is used just like any
"int" type variable would be used and can be seen by its use
in the program. The "enum" type of variable is intended to
be used by you, the programmer, as a coding aid since you
can use a constant named "mon" for control structures rather
that the meaningless (at least to you) value of 1. Notice
that "days" is assigned the values of days of the week in
the remainder of the program. If you were to use a "switch"
statement, it would be much more meaningful to use the
labels "sun", "mon", etc, rather than the more awkward 0, 1,
2, etc. The remainder of the program is simple and will be
left to your inspection and understanding.
PROGRAMMING EXERCISE
1. Write a program to count from 7 to -5 by counting down.
Use #define statements to define the limits. (Hint, you
will need to use a decrementing variable in the third
part of the "for" loop control.
2. Add some print statements to MACRO.C to see the result
of the erroneous addition macro.
Page 45
Comments
Post a Comment