首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我遇到错误: invalid operands binary &和error: invalid operands binary |时,我应该怎么做?

当我遇到错误: invalid operands binary &和error: invalid operands binary |时,我应该怎么做?
EN

Stack Overflow用户
提问于 2012-03-06 21:15:14
回答 3查看 514关注 0票数 0
代码语言:javascript
复制
#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);
}
EN

回答 3

Stack Overflow用户

发布于 2012-03-06 21:20:48

这意味着你正在尝试对不是整数而是结构的东西进行位操作。

对于sigset_t,已经存在名为sigaddsetsigdelsetsigismember的函数,您不应该重新实现它们。sigset_t是一个不透明的东西,除了sigXXXset()函数之外,您不应该使用其他函数来查看它

票数 3
EN

Stack Overflow用户

发布于 2012-03-06 21:21:46

数据类型: sigset_t

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

编辑:这里是我的想法。您可能正在尝试编译从某处(一本书、开放源代码等)复制的代码。这些函数已经存在于库中,不应该被重写。但是如果您真的想这样做,那么请记住,原始代码编写者假设sigset_t是整数或整数类型,而不是结构。

由于在系统中使用sigset_t编译的代码可能被定义为一个结构(我很确定是这样),所以代码将无法编译。

可能的解决方案:

  1. 将sigset_t重新定义为整数(如下面的示例(super-dangerous).

所示,不要包含原始sigset_t为defined)

  • change的系统头代码,以便使用定义的sigset_t进行编译

代码语言:javascript
复制
int sigaddset(sigset_t  *set, int signo)
{
        if (SIGBAD(signo)) 
        { 
            errno = EINVAL; 
            return(-1);
        }
            
        set->bits |= 1 << (signo - 1);
        return 0;
}
票数 2
EN

Stack Overflow用户

发布于 2012-03-06 21:24:21

修复代码。

按位&|运算符要求两端都是整数(两个整数操作数)。

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

在Mac上,如果您足够深入地跟踪系统头文件,就会发现sigset_t是一个__uint32_t,因此上面的代码看起来应该可以工作。如果sigset_t在您的机器上实际上不是一个整数,那么您的代码将失败,并出现与您得到的错误类似的错误。因此,除非你正在实现这个库,否则你应该保持独立,使用这个库提供的东西,而不是编写你自己的标准函数的盗版。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9584428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档