Run me through unifdef -UA *** Nothing should be visible here: #if defined A && defined B hello world #endif #if defined A && B hello world #endif #if defined A && 1 hello world #endif #if defined A && (1 > 0) hello world #endif #if defined B && defined A hello world #endif #if B && defined A hello world #endif #if 1 && defined A hello world #endif #if (1 > 0) && defined A hello world #endif #if defined A && (defined FOO || defined BAR) hello world #endif #if (defined FOO || defined BAR) && defined A hello world #endif *** Everything should be visible here, but #if/#endif removed: #if defined B || !defined A hello world 1 #endif #if !defined A || defined B hello world 2 (last) #endif *** This should be unchanged (#if/#endif not removed): #if defined A || defined B I am here 1 #endif #if defined B || defined A I am here 2 #endif I am here 3 #if !defined FOO && !defined BAR \ && !defined BAZ # error "I am here 4" #endif I am here 5 #if (!defined FOO \ && (defined BAR || defined BAZ \ || defined XYZ)) I am here 6 #endif I am here 7 #if !defined FOO \ && defined BAR I am here 8 #endif I am here 9 (last) *** End