Разница между директивой препроцессора #if и нормальной, если - PullRequest
22 голосов
/ 03 марта 2011

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

Ответы [ 4 ]

20 голосов
/ 03 марта 2011

Операторы с # перед ними называются директивами препроцессора.Они обрабатываются парсером до фактической компиляции кода.С момента первого поиска с использованием 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);
5 голосов
/ 03 марта 2011

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

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

3 голосов
/ 03 марта 2011

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

0 голосов
/ 09 февраля 2017

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

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

...