1. modules
2. manifest constants
3. conditional compilation
and the preprocessor can be deprecated.
It's wholly wrong to try to frame this as "more powerful", specially considering the fact that C already supports generic selection.
https://en.cppreference.com/w/c/language/generic
> There are plenty of them.
There really isn't, at least in the application domains where C dominates, such as embedder programming.
You'd be hard pressed to find any producrion-level tool chain for embedded development which supports anything other than C or even C++, and any decision to pick up even C++ over C for embedded development requires a lot of soul searching.
Actual flags are useful, e.g. -codegenfoo -linkflagbar, but I hate digging through a maze of -DFLIPOPTION1 and -DUSERSUPPLIEDTEXT="hahaha" to unscramble what code the compiler actually sees, and what went wrong because of the various user supplied strings (i.e. #define overwrites).
If other languages also have this, well ugh sorry. I have grown to despise it.