That's a false premise.
Yep. In addition, the preprocessor does all it's work BEFORE the compiler does its thing, which happens before the linker does its thing, which happens before avrdude uploads to the Arduino, which happens long before runtime.
Using #define to define a value to be substituted at run time just is not possible.