当我遇到错误时我该怎么办:二进制操作数无效 &和错误:二进制操作数无效 |?


#include <signal.h>
#include <errno.h>
#define SIGBAD(signo)   ((signo) <= 0 || (signo) >= NSIG)
int sigaddset(sigset_t  *set, int signo)
{
        if (SIGBAD(signo)) { errno = EINVAL; return(-1);}
        *set |= 1 << (signo - 1);
        return 0;
}
int sigdelset(sigset_t *set, int signo)
{
        if (SIGBAD(signo)) { errno =EINVAL; return -1; }
        *set &= ~(1 << (signo - 1));
        return 0;
}
int sigismember(const sigset_t *set, int signo)
{
    if (SIGBAD(signo)) { errno = EINVAL; return -1; }
    return ((*set & (1 << (signo -1))) != 0);
}

这意味着你试图对不是整数而是结构的东西进行位运算。

对于sigset_t,已经存在名为sigaddset、sigdelset和sigismember的函数,您不应该重新实现它们。sigset_t是一个不透明的东西,除了sigXXXset()函数

之外,你不应该在它里面到处乱找

数据类型:sigset_t

sigset_t数据类型用于表示信号集。在内部,它可以实现为整数或结构类型。

为了便于移植,请仅使用本节中描述的功能初始化、更改和检索sigset_t中的信息对象--不要试图直接操作它们。

编辑:以下是我的想法。您可能正在尝试编译从某个地方复制的代码(书籍、开源等)。这些函数已经存在于库中,不应重写。但是,如果您真的想这样做,请记住,最初的代码编写者假设sigset_t是整数或整型,而不是结构。

由于在使用sigset_t编译的系统中,可能(我很确定它是)被定义为一个结构,因此代码不会编译。

可能的解决方案:

  1. 将sigsett重新定义为整数(不要包含定义原始sigsett的系统头)
  2. 更改代码以使用定义的sigsett进行编译,如下面的示例所示(超级危险)
int sigaddset(sigset_t  *set, int signo)
{
        if (SIGBAD(signo)) 
        { 
            errno = EINVAL; 
            return(-1);
        }
            
        set->bits |= 1 << (signo - 1);
        return 0;
}

修复代码。

按位&|运算符需要两边都有整数(两个整数操作数)。

您似乎正在(重新)实现标准库函数。因此,你必须了解类型sigset_t的内部,但不清楚它的类型是什么。如果你不知道类型的细节是什么,你就没有业务重新实现这些功能。

在Mac OS X上,如果您在系统头中跟踪足够远,那么sigset_t就是__uint32_t,所以上面的代码看起来应该可以工作。如果sigset_t在您的机器上实际上不是一个整数,那么您的代码将失败,并出现与您得到的错误类似的错误。因此,除非正在实现库,否则您应该单独使用库提供的内容,而不是编写自己的标准函数的盗版版本。

相关内容

最新更新