No Us Without You: elifdef and elifndef
thephd.github.io
thephd.github.io
Hear hear. This sort of union of a flow-control construct with a specific type of expression, seems an ugly thing. That it may save typing a few characters, doesn't count for much.
I guess you can always write a pre-preprocessor to fix things up for an older preprocessor. But, ugh.
That said, there is so much C code in existence assuming the existing C preprocessor, it is more feasible to add new features to the existing one than replace it with something new and incompatible.
I wish they'd add some better syntax for multi-line macros. So instead of:
#define TRY(what) \
do { \
int r = (what); \
if (r != 0) \
return r; \
} while (0)
you could write something like this: #macro TRY(what)
do {
int r = (what);
if (r != 0)
return r;
} while (0)
#endmacro
Get rid of the backslashes (which are easy to screw up). It would also enable you to use #if conditionals inside the #macro block, so you could easily write conditional macros.Also, maybe instead of the do { ... } while (0) trick, #macro could automatically insert do { } while (0), maybe say if the #macro had a { on the same line:
#macro TRY(what) {
int r = (what);
if (r != 0)
return r;
}
#endmacro
Some kind of looping support (e.g. #while) would also be great: #macro NULLS(count)
# local i 0
# while (i < count)
NULL,
# define i i+1
# endwhile
#endmacro
In the above, #local is #define but local to the #macro block.For anyone curious about the practicality of that sort of thing, A CPS macro continuation machine like https://github.com/rofl0r/order-pp/blob/master/inc/order/cm.... would give you about 18 quintillion loop iterations if my math was right; double the length of that file and you’d have more loop iterations than atoms in the universe.
Sure, in isolation it's more orthogonal. But it's hard to see this as a real value add when amortised against the compatibility headache, when the arguably cleaner alternative of `#if defined FOO ... #elif defined BAR ... #endif` is already available.
(Incidentally (1) you can choose to also spell out `#ifdef FOO` as `#if defined FOO` when it's one of a list of alternatives like this, so they all look similar; (2) there's no need for excess parentheses with `#if defined` either.)
[1] N2645: "Note that #ifdef has been present since C89 and I couldn't find any papers in the WG14 log that seemed to touch on this topic."
#if FOO
foo();
#elif BAR
bar();
#endif
#if FOO
foo();
#else
#if BAR
bar();
#endif
#endif
I guess it works but it's clunkier.C itself doesn't need this, because you can write `else if …` without needing to put another layer of braces around the subordinate `if` statement.