FWIW, at least in C++ it is now 'preferred' to use const variables and inline functions instead of #define when possible, although plenty of people still do it the other way.
For instance:
#define PI 3.1415
#define AREA_OF_CIRCLE(r) (PI*r*r)
vs.
const float PI=3.1415;
inline float area_of_circle(float r) { return PI*r*r; }
In the olden days, the former way was faster, but all C++ compilers will generate equivalent code. The advantages of the latter are that that you get better type checking, better error messages, and you can do thinks like take the address of the variable or function in cases where you need to pass pointers. In C you may have to use the former. The C89 standard doesn't officially include inline, and while most or all C compilers support it, their implementations may not be compatible.
The most important use of #define is actually for conditional compilation using #if. If you have two versions of code and need to select which one is compiled on a given platform, you would use a #define variable. Other than that, #define macros are mostly only actually necessary when you are doing something really ugly that can't be accomplished in an inline function, like trying to imitate dynamic programming constructs in C.