Serg79, ну дык ты ж не так написал 

 ты написал без предварительного дефайна.
Оцени:
#if VALUE == ONE
и 
#define VALUE one
#define ONE one
#if VALUE == ONE
Разница в восприятии человека - колоссальна.
Если в первом случае надо объяснять азы, что легче всегда направить к учебнику. 
Во втором надо сказать о невозможности сравнения текста. 
В любом случае, прошу прощенья за резкость. 
Но и ты меня пойми, есть куча вопросов, большинство из которых "Как сделать" без единой попытки понять самому. Отсюда резкость в отношении к глупым копированиям кода из примеров в компилятор 

В любом случае я не отрицаю правоты ЛогРуса - естественно дефайн подменяет в коде на значение, но я могу написать например так:
#define getvalue(a,b,c,d,e) \ 
  ( (a+b) / c + (d * e))
В результате в коде могу написать вызов:
int a = getvalue(x,y,z, log bol);
При дебагировании входа в код не будет. Это будет макрос, который сможет вычислять значение выражения. 
Т.е. при заранее неизвестных значениях происходит замена не просто текстом, а подмена вычилением записи вызова. 
И хоть значения неизвестны, вычисления будут проводится с заданными в рантайм значениями, а не с подменой нулем, как писалось ранее 
 
 В общем смотрите код читайте 
