Директива препроцессора для повторяющихся блоков кода (с условием)

Есть ли способ в C++ для реализации концепции, как следующий псевдокод?

#pragma REPEAT

for (;;)
{
    // code block #1

    #pragma REPEAT_CONDITION(a==1)
        // code
    #end_pragma

    // code block #2
}

#end_pragma

Который будет скомпилирован как-то так:

if (a == 1)
{
    for (;;)
    {
        // code block #1

        // code

        // code block #2
    }
}
else
{
    for (;;)
    {
        // code block #1

        // code block #2
     }
}

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

1 ответ

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

Здесь я предполагаю, что вы не хотите проверять условие каждый раз в цикле, даже если это значительно очищает ваш код:

for (;;) {
    // code block #1
    if (a == 1) {
        // code
    }
    // code block #2
}

Единственная причина, по которой я мог думать о том, что вы делаете это, заключается в дополнительной скорости, когда вы не выполняете проверку несколько раз, но вы, возможно, захотите на самом деле проверить влияние, которое она оказывает. Если не // code Это очень просто, это, скорее всего, затмит эффект одного условного утверждения.

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

if (a == 1) {
    for (;;) {
        callCodeBlock1();
        // code
        callCodeBlock2();
} else {
    for (;;) {
        callCodeBlock1();
        callCodeBlock2();
    }
}
Другие вопросы по тегам