我有许多信号可以为真、假或无效,但只有其中一个可以为真,否则就是错误。

我想知道是否有一种方法可以轻松检查这一点而不是需要做一个大的 if 语句

enum sig_type
{
  sig_invalid, sig_true, sig_false
};

sig_type sig1 = GetSignal("sig1");
sig_type sig2 = GetSignal("sig1");
sig_type sig3 = GetSignal("sig1");
sig_type sig4 = GetSignal("sig1");

if (sig1 == sig_true)
{
  if (sig2 == sig_true || sig3 == sig_true || sig4 == sig_true)
  {
    // Error
  }
}
else if (sig2 == sig_true)
{
  if (sig1 == sig_true || sig3 == sig_true || sig4 == sig_true)
  {
    // Error
  }
}

等等......这是大量的代码并且只会随着我添加信号而增加,因此在这种状态下将无法管理

最佳答案

您可以使用 C 中的逻辑表达式计算结果为 0 表示假或 1 表示真这一事实,并将它们相加。如果总数大于 1,则有错误,否则不会。

另外,如果您认为将来可能需要更多(或只是可变数量的)信号,我会使用数组来保存它们而不是单独的变量。然后可以在 for 循环内完成测试:

sig_type sig[NSIGNALS];
int t = 0;

for (int i = 0; i < NSIGNALS; ++i) {
    char buf[50];   /* Make sure your buffer is large enough, of course */
    sprintf(buf, "sig%d", i + 1);    /* Or however you want to generate it */
    sig[i] = GetSignal(buf);
    t += sig[i] == sig_true;
}

if (t > 1) {
    /* Complain */
}

如果您的意思是恰好 1 个信号必须为真,请将 t > 1 测试替换为 t != 1

编辑: 最初在错误处理程序中有一个 throw,虽然那不是 C。

10-08 04:55