gerald_duck |
Wed 2013-06-19 16:31 |
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:
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;
}
}
|
|