#define SECOND(a, b, ...) b #define IS_PROBE(...) SECOND(__VA_ARGS__, 0) #define PROBE() ~, 1 #define CAT(a,b) a ## b #define NOT(x) IS_PROBE(CAT(_NOT_, x)) #define _NOT_0 PROBE() #define BOOL(x) NOT(NOT(x)) Should be 0: BOOL(0) Should be 1: BOOL(1) Should be 1: BOOL(123) Should be 1: BOOL(not zero) Should be 1: BOOL()