... > > > #define const_NULL(x) _Generic(0 ? (x) : (char *)0, char *: 1, void *: 0) > > > #define const_true(x) const_NULL((x) ? NULL : (void *)1L)) > > > #define const_expr(x) const_NULL((x) ? NULL : NULL)) > > > I send this morning. > > > Needs 's/char/struct kjkjkjkjui/' applied. > > > > Oh Christ. You really are taking this whole ugly to another level. > > I sort of liked that version in a perverse sort of way. > It does give you a simple test for NULL (unless you've used 'struct kjkjkjkjui'). Except const_NULL() really doesn't work at all - so you are lucky :-) So maybe the slightly long lines: #define const_true(x) _Generic(0 ? (void *)((x) + 0 ? 0L : 1L) : (char *)0, char *: 1, void *: 0) #define const_expr(x) _Generic(0 ? (void *)((x) + 0 ? 0L : 0L) : (char *)0, char *: 1, void *: 0) I make that 98 characters. Of course, you can remove all the spaces, only one of the constants need the L suffix and 'int' is a shorter type name. That cuts is down to 76: #define const_expr(x) _Generic(0?(void*)((x)+0?0L:0):(int*)0,int*:1,void*:0) which starts looking like the TECO commands to parse its command line! David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)