A define directive is used during compile time, almost like a variable, and is treated as a constant at run time. A variable is around during run time, in memory, rather than being a constant value.
In the above case, the compiler can optimize for memory and never put BLAH_2 into RAM. I didn't stop to think about scoping, which of course is the major difference :)