Yes, you can, if the #defines are literals themselves. The compiler never sees the pre-preprocessor code so it doesn't care.
They are compile time constants. You can't switch constants defined in your program.
You just can't use an expression that must be evaluated at runtime, eg
#define YES 0
#define NO 1
/* ... */
case YES: break;
case NO: break;
You can use a constant expression, as long as that expression can be evaluated by the compiler (I think, not sure on this one):
It's like initializing a global/static variable.