Как я могу отменить и определить значение препроцессора во время выполнения

0

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

PORT
MOB
PORT
MOB...10 times

Итак, если бы я мог изменить его во время выполнения, как я могу это сделать. Я объявил PORT в VS project->Propoties->C/C++->Preprocessor

int main()
{
    int i;
    for(i = 0; i <= 10; i++)
    {
#ifdef PORT
        printf("PORT\n");
#endif
        if(i == 5)
        {
#ifdef PORT
#undef PORT
#endif
#define MOB 1
        }
#if MOB
        printf("MOB\n");
#endif
    }
    return 0;
}
Теги:
visual-studio-2010

4 ответа

3
Лучший ответ

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

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

for (int i=0; i<5; i++)
    printf("PORT\n");

for (int i=0; i<5; i++)
    printf("MOB\n");

...или:

for (int i=0; i<10; i++)
   printf(i < 5 ? "PORT\n", "MOB\n");

Хотя вы не упомянули об этом, я добавлю, что шаблоны C++ имеют одинаковую ограниченность, поэтому попытка сделать это с ними, скорее всего, (хотя, возможно, и немного менее определенно) окажется похожей. Шаблоны дают вам больше возможностей для проверки и изменения их результатов в соответствии с остальной частью программы, но только немного. В конечном счете, параметры шаблона должны быть константами времени компиляции, поэтому шаблоны можно разрешить во время компиляции.

2

Это невозможно. Директивы препроцессора являются частью компиляции. Нет такой вещи, как препроцессор времени исполнения, вы не можете изменять директивы во время выполнения. Двоичный файл не знает о директивах препроцессора.

1

Это невозможно.

Препроцессор работает как один из первых проходов в исходном файле до его компиляции.

Вы не можете манипулировать препроцессором во время выполнения вашей программы. Вместо этого используйте обычные переменные.

1

Вы не можете. Препроцессор запускается как отдельный шаг перед компиляцией. Невозможно выполнить это время выполнения.

Вы должны сделать это, используя обычную обработку if и else с переменными.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню