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

Popular posts from this blog

BOTTOM LIVE script

Fawlty Towers script for "A Touch of Class"