Разница между препроцессорной директивой #if и нормалью if

В чем разница между директивой #if препроцессора и нормалью, if в C ? Я новичок в C.

Заявления с # перед ними называются препроцессорными директивами. Они обрабатываются парсером до того, как код действительно скомпилирован. Из первого поиска с помощью 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); 

Препроцессор, if позволяет вам установить код до его отправки в компилятор. обычно используется для остановки добавления кода заголовка дважды.

редактировал, имел ли в виду C ++, потому что он был помечен как таковой? http://www.learncpp.com/cpp-tutorial/110-a-first-look-at-the-preprocessor/

Препроцессор if обрабатывается препроцессором в качестве первого шага в скомпилированной программе. Нормальный, если обрабатывается во время выполнения программы. Директива препроцессора используется для включения условной компиляции с использованием разных разделов кода в зависимости от разных определенных констант / выражений препроцессора. Нормальный, если используется для управления streamом в исполняющей программе.

Директива препроцессора проверяет macros или, другими словами, #define директивы и заменяет определение, если оно определено. Следовательно, проверяются только макропеременные. Это выполняется на этапе предварительной обработки.

Нормальный if или токен streamа управления, если проверяет условие с переменными или возвращаемыми значениями функции. Эта проверка выполняется во время выполнения.