У меня есть код ниже. Где я хотел бы определить значение 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;
}
Препроцессор (как подразумевается именем) делает то, что он делает в качестве первого шага в компиляции (или, в зависимости от вашей точки зрения, до компиляции полностью). Вещи, которые происходят во время выполнения, не могут контролировать вещи, которые произошли ранее. Вы не можете изменить что-либо, сделанное препроцессором во время выполнения.
Чтобы получить желаемый эффект, вы можете отказаться от попыток использовать определение предварительного процессора для использования обычной переменной или обычного управления потоком.
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++ имеют одинаковую ограниченность, поэтому попытка сделать это с ними, скорее всего, (хотя, возможно, и немного менее определенно) окажется похожей. Шаблоны дают вам больше возможностей для проверки и изменения их результатов в соответствии с остальной частью программы, но только немного. В конечном счете, параметры шаблона должны быть константами времени компиляции, поэтому шаблоны можно разрешить во время компиляции.
Это невозможно. Директивы препроцессора являются частью компиляции. Нет такой вещи, как препроцессор времени исполнения, вы не можете изменять директивы во время выполнения. Двоичный файл не знает о директивах препроцессора.
Это невозможно.
Препроцессор работает как один из первых проходов в исходном файле до его компиляции.
Вы не можете манипулировать препроцессором во время выполнения вашей программы. Вместо этого используйте обычные переменные.
Вы не можете. Препроцессор запускается как отдельный шаг перед компиляцией. Невозможно выполнить это время выполнения.
Вы должны сделать это, используя обычную обработку if
и else
с переменными.