Подтвердить что ты не робот

"if" и "#if"; который лучше использовать

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

Какая разница в моем коде, если я использую #if вместо if?

Какой из них лучше использовать и почему?

4b9b3361

Ответ 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