"复位"使用C宏循环DSL?

时间:2018-06-04 20:43:41

标签: c macros dsl

我想要一个循环运行一次,除非设置为重复,但我不喜欢必须明确设置变量作为正常程序流程的一部分的丑陋。

我使用这个,但项目维护者并不喜欢它:

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 :(得分:1)

使用XOR 1在0和1之间重复切换是非常好的,特别是在与硬件相关的代码中。 这是你想要做的吗?但这不是你如何使用它,所以它没有意义。另外,将它与signed int一起使用是值得怀疑的。

请不要发明一些丑陋的宏语言,这要差10倍!这是你能做的最糟糕的事情。

没有理由不能简单地做一些事情:

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