Преимущества условно-препроцессора перед условными выражениями

Я никогда не работал с#если,#ifdef,#ifndef,#else,#elif а также#endif.

Когда я просматривал некоторые исходные коды, я нашел широкое применение этих директив. Прочитал об условно-препроцессорах, но не нашел подсказкичем они отличаются от обычных условных выражений, Поэтому мне было интересно, в чем преимущество следующего кода:

#include
int main()
{
    int i = 0;

    #if i == 0
         std::cout
 user39576009 июн. 2013 г., 09:10
@xaxxon я нене вижу этого. Вопрос состоит в том, какой из них следует использовать, когда, но этоэто вполне законный, отвечающий на вопросы вопрос, а не дискуссия.
 Bo R10 нояб. 2018 г., 14:56
Если вы перефразируете примеры для использованияint i = 1; и запустить их, вы увидите, что результаты совершенно разные. в#if делоi вряд ли известен препроцессору и, таким образом, получает значение по умолчанию 0 при оценке.#if i == 0
 xaxxon09 июн. 2013 г., 09:02
 user39576009 июн. 2013 г., 09:16
@xaxxon Много вопросов задавай "когда его использовать (против этого другого) и получить объективные ответы. Два примера:stackoverflow.com/q/2189452/395760 а такжеstackoverflow.com/q/322715/395760
 xaxxon09 июн. 2013 г., 09:08
@ Блендер уверен.I would like to participate in a discussion about ______”, then you should not be asking here  iKishore хочет принять участие в обсуждении относительных преимуществ использования условного препроцессора.
 xaxxon09 июн. 2013 г., 09:13
@delnan, когда вы можете использовать его, возможно. Но просто "когда его использовать? подразумевает суждение и контекст. Когда это конкретно не предусмотрено в контексте вопроса, это начало дискуссии, потому что оно требует многословных объяснений различных контекстов и относительных достоинств.
 Joachim Isaksson09 июн. 2013 г., 09:09
В этом (и во многих) случаях, если вы включаете оптимизацию в своем компиляторе, онидадим такой же результирующий двоичный файл. Ваш первый пример имеет проблему синтаксиса, так как#if не может работать с обычными переменными.
 xaxxon09 июн. 2013 г., 09:43
Маржа против отступов является объективной, потому что нет возможности использовать один или другой для достижения тех же результатов. Я'Я полагаю, что Java идет вразрез с FAQ
 Blender09 июн. 2013 г., 09:03
@xaxxon: Можете ли вы объяснить, как эта ссылка актуальна?
 Aiias09 июн. 2013 г., 09:02
Для начинающих,if оценивается во время выполнения и#if оценивается перед компиляцией
 Jens Gustedt09 июн. 2013 г., 09:15
Ваш код неC. Сообщество C ++, вероятно, по-разному относится к этой проблеме.

Ответы на вопрос(5)

что код выбрасывается. Это нет компилируется (что занимает много времени), и это несгенерировать машинный код, который будет загружен в оперативную память. Если решение принимается ОЧЕНЬ жестким циклом, работающим ОЧЕНЬ раз, может быть улучшение скорости. Дон»Я полагаю, что это важно, если вы на самом деле не рассчитали время.

Ущерб препроцессора заключается в том, что вы, очевидно, должны знать ответ во время компиляции. Исходный код теперь содержит много кода, который может никогда не исполниться. Человеку становится все труднее отследить, потому чтоЧасто трудно определить, какими были бы эти значения времени компиляции.

 user39576009 июн. 2013 г., 09:08
На самом деле, если условие является константой времени компиляции (и достаточно простым, чтобы препроцессор был опцией), компилятор обычно может вывести это и удалить мертвый код, если он 'проверено с.if
 xaxxon09 июн. 2013 г., 09:10
Правда достаточно. Это'Всегда полезно помнить, насколько умны компиляторы. Люди часто пишут запутанный код, чтобы попытаться выполнить некоторую преждевременную оптимизацию, а затем понимают, чтомы не сделали это быстрее иСложнее читать / поддерживать.
Решение Вопроса

Это'понимаете, работает с константами? Во время компиляции он смотрит на различные условия и вводит / опускает исходный код в соответствии с ним.

Например:

#define HAS_COMPARISON

int main() {
    #ifdef HAS_COMPARISON
        int i = 0;
        if(i == 0) std::cout << "This";
        else
    #else
        std::cout << "That";
    #endif
}

Сdefine установить, он установит переменнуюi и выполнить сравнение ... короче, он выведетThis, Если вы прокомментируете это определение, весь блок не будет в вашей программе, что означает, что он всегда будет выводитьThat, без установки переменной или сравнения.

Тот's наиболее распространенное использование препроцессора определяет. Вы также можете определить значения и сравнить их, чтобы иметь переменное поведение с тем же определением, но этоЕще одна проблема.

Еще раз: условный препроцессор оценивается во время компиляции, переменные условия оцениваются во время выполнения.

 ikis09 июн. 2013 г., 09:19
@RefugnicEternium it 'Теперь все ясно. Спасибо. :)
 Refugnic Eternium09 июн. 2013 г., 09:15
@iKishore Нет, тыисправить. Если оно'установлен на ЛЮБОЕ значение,#else исключается, а если#define удаляется из кода, все из#ifdef в#else устранено.
 ikis09 июн. 2013 г., 09:12
Поправь меня, если ям неправильно, это как еслиHAS_COMPARISON перед компиляцией устанавливается 0, тогда компилятор исключает блок внутри#else & #endif как это делается дляустранение мертвого кода.
 user39576009 июн. 2013 г., 09:14
@iKishore Theпрепроцессор удаляет код до того, как его увидит компилятор, что важно, потому что кодСделанное условно может не скомпилировать / вызвать ошибку, когда компилятор ее видит (например, из-за ошибок типа или отсутствующих функций).

что код ifdef-out фактически никогда не находится в конечном связанном приложении. Простое использование языковых условных выражений означает, что обе ветки находятся в конечном коде, что делает его больше и потенциально труднее тестировать и т. Д.

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

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

#if OS == LINUX
//do something
#elif OS == SOLARIS
//do something else
#else
//
#endif

Ключ в том, что#if оценивается во время компиляции, ноif оценивается при запуске программы.

#if BYTE_ORDER == LITTLE_ENDIAN
//do something
#else
//do something else
#endif

Но использование этих директив препроцессора полезно во многих других случаях.

Эти директивы препроцессора могут использоваться для условной компиляции. например Если необходимо разработать какую-либо программу для нескольких платформ, то константам, зависящим от платформы, могут быть заданы значения. Изменение этих значений может быть выполнено для конкретной платформы, в то время как весь код может поддерживаться как один большой объект.

Они также полезны при отладке. Тестовые модули могут быть скомпилированы в код и запущены с использованием этих условных компиляций во время отладки, и они могут быть остановлены от компиляции с помощью них.

Ваш ответ на вопрос