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