The perversion of defining a macro in the expansion of another macro is orthogonal to the issue of whether or not preprocessor directives can be freely interpolated. The C/C++'s preprocessor could have allowed:
#define MOO(define) #define x QUACK
…but they've prohibited it from working the way you might expect (and hijacked # inside macros for another purpose, which is why I was sick and used "define" as the macro parameter's name (-8 ).
I'm guessing they decided that macros defining macros was a can of worms best left unopened.
At this point I'm remembering Modula-3's pragma syntax: <* … *> to go with the Wirth (* … *) for comments. (How come everyone's happy using [ … ] for arrays in Pascal instead of (. … .), but still uses (* … *) instead of { … } for comments?) Had C used something similar, we could have avoided all this __attribute__ and __declspec nonsense for starters!
If I ever design a language in the C problem space, knowing what I know now, the pragma syntax will be something like:
…but they've prohibited it from working the way you might expect (and hijacked # inside macros for another purpose, which is why I was sick and used "define" as the macro parameter's name (-8 ).
I'm guessing they decided that macros defining macros was a can of worms best left unopened.
At this point I'm remembering Modula-3's pragma syntax: <* … *> to go with the Wirth (* … *) for comments. (How come everyone's happy using [ … ] for arrays in Pascal instead of (. … .), but still uses (* … *) instead of { … } for comments?) Had C used something similar, we could have avoided all this __attribute__ and __declspec nonsense for starters!
If I ever design a language in the C problem space, knowing what I know now, the pragma syntax will be something like:
void f() { #pragma #switch(COMPILER_VERSION) { RECENT_GCC: diagnostic push; diagnostic ignored "-Wuninitialized"; break; MSVC: warning(push); warning(disable: C4700); break; } // Do some stuff... #pragma #switch(COMPILER_VERSION) { RECENT_GCC: diagnostic pop; break; MSVC: warning(pop); break; } }