Операторы с # перед ними называются директивами препроцессора.Они обрабатываются парсером до фактической компиляции кода.С момента первого поиска с использованием Google (http://www.cplusplus.com/doc/tutorial/preprocessor/):
Директивы препроцессора - это строки, включенные в код наших программ, которые не являются программными операторами, а являются директивами для препроцессора. Этим строкам всегда предшествует знак хеша (#Препроцессор выполняется до того, как начинается фактическая компиляция кода, поэтому препроцессор переваривает все эти директивы до того, как операторы сгенерируют какой-либо код.
Таким образом, #if будет определен во время компиляции,"нормальный", если будет решен во время выполнения. Другими словами,
#define TEST 1
#if TEST
printf("%d", TEST);
#endif
будет компилироваться как
printf("%d", 1);
Если вместо этого вы написали
#define TEST 1
if(TEST)
printf("%d", TEST);
Программа будет на самом деле скомпилировать как
if(1)
printf("%d", 1);