                       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  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.   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 STARTs 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
        "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


                                  Page 43









                       Chapter 6 - Defines and Macros


        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 the third line 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 12 of the program is reached,
        "index" will be substituted for every "A",  and "count" will
        be  substituted  for  every "B".   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 first
        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 =
        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.


                                  Page 44









                       Chapter 6 - Defines and Macros



             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.










































                                  Page 45
