"if" и "#if"; который лучше использовать
Я узнал, что if
или #if
могут использоваться для проверки условий.
Как мы можем проверить условия с помощью if
, почему мы должны использовать препроцессор #if
?
Какая разница в моем коде, если я использую #if
вместо if
?
Какой из них лучше использовать и почему?
Ответы
Ответ 1
if
и #if
- разные вещи в разных целях.
Если вы используете оператор if
, условие оценивается во время выполнения, а код для обеих ветвей существует в скомпилированной программе. Условие может быть основано на информации о времени выполнения, таком как состояние переменной. if
предназначен для стандартного управления потоком в программе.
Если вы используете препроцессор #if
, условие оценивается во время компиляции, а код для ложной ветки - не, включенный в скомпилированную программу. Условие может основываться только на информации времени компиляции (например, константы #define
и тому подобное). #if
предназначен для разного кода для разных сред компиляции (например, для компиляции в Windows vs. * nix используется другой код).
Ответ 2
мы не могли сказать, что лучше использовать, потому что один используется на фазе компиляции (#if
), а другой используется в фазе времени выполнения (if
)
#if 1
printf("this code will be built\n");
#else
printf("this code will not\n");
#endif
попытайтесь создать вышеуказанный код с помощью gcc -E
, и вы увидите, что ваш компилятор сгенерирует еще один код, содержащий только:
printf("this code will be build\n");
другой printf не будет присутствовать в новом коде (код предварительного процессора), а затем нет в двоичном коде программы.
Заключение: #if
обрабатывается на этапе компиляции, но нормальный if
обрабатывается, когда ваша программа запускается
Вы можете использовать #if 0
в части вашего кода, чтобы компилятор не компилировал его. это, как вы прокомментировали эту часть
Пример
int main(void) {
printf("this code will be build\n");
#if 0
printf("this code will not\n");
#endif
}
что эквивалентно
int main(void) {
printf("this code will be built\n");
/*
printf("this code will not\n");
*/
}
Ответ 3
Эй, оба разные
-
#if
Проверяет, выполняется ли условие во время компиляции.
-
if
оценивается во время выполнения.
Ответ 4
Вы должны использовать #if, когда результат условия известен во время компиляции и регулярный, если результат неизвестен до времени выполнения.
#if DEBUG
Я знаю во время компиляции я делаю отладочную сборку
if (date == DateTime.Today)
Зависит от того, в какой день он
Ответ 5
Некоторые использования #if
:
- Вы хотите добавить дополнительные отпечатки или проверить, когда вы создаете отладочную версию своего кода.
- вы хотите, чтобы компилятор не включал .h файл дважды
- вы хотите написать код, который будет использовать разные системные вызовы, и в зависимости от системы он будет скомпилирован с использованием соответствующих.
Поскольку все перечисленные выше проверяются во время компиляции, это означает, что:
- Условие должно быть оценено в compiletime
- Полученный код не будет содержать ветки, которые оценивают значение false, что приводит к меньшему коду и быстрее, поскольку условие не проверяется каждый раз, когда программа запускается.
Примеры:
Добавление дополнительных проверок только для режима отладки:
#define DEBUGLEVEL 2
#if DEBUGLEVEL > 1
printf("The value of x is: %d", x);
#end if
#if DEBUGLEVEL > 2
printf("The address of x is: %x", &x);
ASSERT(x > 100);
#end if
Обеспечение включения заголовка включается только один раз:
#ifndef PERSON_H
#define PERSON_H
class Person{
....
};
#end if
Наличие другого кода в зависимости от платформы:
#ifdef WINDOWS
time = QueryPerformanceCounter(..);
#else
time = gettimeofday(..);
#endif