«сбрасываемый» цикл DSL с макросами C? - PullRequest
0 голосов
/ 04 июня 2018

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

Я использую это, но проектСопровождающим это не понравилось:

int ok = 0;
while (ok^=1) {
    // ...
    if (something_failed) ok = 0;
}

(сравните с while (!ok) { ok = 1; // ...)

Приятно, что вы можете заключить их в макросы:

#define RETRY(x) while (x^=1)
#define FAIL(x) x = 0

и использовать их как

int ok = 0;
RETRY(ok) {
    // ...
    if (something_failed) FAIL(ok);
}

Как я могу заставить эти макросы работать без странного xor-assign?

1 Ответ

0 голосов
/ 04 июня 2018

Использование XOR 1 для многократного переключения между 0 и 1 прекрасно, особенно в аппаратном коде. Это то, что вы пытаетесь сделать? Но это не то, как вы используете это, так что это не имеет смысла.Кроме того, сомнительно использовать его вместе со знаком int.

Пожалуйста, не изобретайте некрасивый язык макросов, это в 10 раз хуже!Это худшее, что вы можете сделать.

Нет никаких причин, почему вы не можете просто сделать что-то вроде этого:

bool retry = true;
while(retry)
{
  retry = false;
  ...
  if(something_failed) retry = true;
}
...