C 遇到错误时应该怎么办:二进制操作数无效&;and错误:二进制|的操作数无效? #包括 #包括 #定义SIGBAD(signo)((signo)=NSIG) int sigaddset(sigset\U t*set,int signo) { if(SIGBAD(signo)){errno=EINVAL;返回(-1);} *set |=1

C 遇到错误时应该怎么办:二进制操作数无效&;and错误:二进制|的操作数无效? #包括 #包括 #定义SIGBAD(signo)((signo)=NSIG) int sigaddset(sigset\U t*set,int signo) { if(SIGBAD(signo)){errno=EINVAL;返回(-1);} *set |=1,c,C,这意味着您试图对非整数的对象(例如结构)执行位运算 对于sigset\u t已经存在命名的函数,您不应该重新实现它们。sigset\u t是一个不透明的东西,除了sigXXXset()函数之外,您不应该在其中到处乱翻。这意味着您试图对不是整数的东西执行位操作,例如结构 对于sigset\u t已经存在名为的函数,您不应该重新实现它们。sigset\u t是一个不透明的东西,除了sigXXXset()函数之外,您不应该在其中到处乱翻 数据类型:sigset\u t sigset_t数据类型用于表示

这意味着您试图对非整数的对象(例如结构)执行位运算


对于
sigset\u t
已经存在命名的函数,您不应该重新实现它们。
sigset\u t
是一个不透明的东西,除了sigXXXset()函数之外,您不应该在其中到处乱翻。这意味着您试图对不是整数的东西执行位操作,例如结构

对于
sigset\u t
已经存在名为的函数,您不应该重新实现它们。
sigset\u t
是一个不透明的东西,除了sigXXXset()函数之外,您不应该在其中到处乱翻

数据类型:sigset\u t

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

为了便于移植,请仅使用本节中描述的功能 从sigset\t初始化、更改和检索信息 对象不会试图直接操纵它们

编辑:以下是我的想法。您可能正试图编译从某处复制的代码(书籍、开放源码等)。这些函数已存在于库中,不应重写。但如果您确实希望这样做,请记住,原始代码编写者假定sigset__t是整数或整数类型,而不是结构

因为在使用sigset_t编译的系统中,可能(我很确定它是)定义为结构,所以代码不会编译

可能的解决办法:

  • 将sigset重新定义为整数(不包括定义原始sigset的系统头)
  • 将代码更改为使用定义的sigset\u t编译,如下面的示例所示(超级危险)
  • int-sigaddset(sigset\u t*set,int-signo)
    {
    if(SIGBAD(signo))
    { 
    errno=EINVAL;
    返回(-1);
    }
    设置->位|=1
    数据类型:sigset\u t

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

    为了便于移植,请仅使用本节中描述的功能 从sigset\t初始化、更改和检索信息 对象不会试图直接操纵它们

    编辑:以下是我的想法。您可能正试图编译从某处复制的代码(书籍、开放源码等)。这些函数已存在于库中,不应重写。但如果您确实希望这样做,请记住,原始代码编写者假定sigset__t是整数或整数类型,而不是结构

    因为在使用sigset_t编译的系统中,可能(我很确定它是)定义为结构,所以代码不会编译

    可能的解决办法:

  • 将sigset重新定义为整数(不包括定义原始sigset的系统头)
  • 将代码更改为使用定义的sigset\u t编译,如下面的示例所示(超级危险)
  • int-sigaddset(sigset\u t*set,int-signo)
    {
    if(SIGBAD(signo))
    { 
    errno=EINVAL;
    返回(-1);
    }
    设置->位|=1修复代码

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

    您似乎正在(重新)实现标准库函数。因此,您必须了解类型
    sigset\t
    的内部结构,但不清楚其类型。如果您不知道该类型的详细信息,则无法重新实现该函数

    在Mac OS X上,如果您通过系统头进行足够长的跟踪,
    sigset\u t
    是一个
    \uu uint32\u t
    ,因此上面的代码看起来应该可以工作。如果
    sigset\u t
    在您的机器上实际上不是一个整数,那么您的代码将失败,并出现与您所得到的错误类似的错误。因此,除非您正在实现该库,否则y你应该好好利用库提供的功能,不要编写自己的标准函数盗版版本。

    修复代码

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

    您似乎正在(重新)实现标准库函数。因此,您必须了解类型
    sigset\t
    的内部结构,但不清楚其类型。如果您不知道该类型的详细信息,则无法重新实现该函数


    在Mac OS X上,如果您通过系统头进行足够长的跟踪,
    sigset\u t
    是一个
    \uu uint32\u t
    ,因此上面的代码看起来应该可以工作。如果
    sigset\u t
    在您的机器上实际上不是一个整数,那么您的代码将失败,并出现与您所得到的错误类似的错误。因此,除非您正在实现该库,否则y你应该不用管它,使用库提供的东西,不要编写你自己的盗版版本的标准函数。

    你为什么要做手动信号位处理?肯定已经有系统宏了吗?好吧,首先,你可以停止将不透明类型视为整数。你把这段代码带到哪里去了?嗯,我想他有编译现有代码(linux内核?)时出现问题。他可能只需要正确的编译器选项。你能用括号括住*set吗?比如
    (*set)
    为什么要手动处理信号位?当然已经有系统宏了?好吧,首先,你可以停止将不透明类型视为整数。你在哪里做的
    #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);
    }
    
    int sigaddset(sigset_t  *set, int signo)
    {
            if (SIGBAD(signo)) 
            { 
                errno = EINVAL; 
                return(-1);
            }
                
            set->bits |= 1 << (signo - 1);
            return 0;
    }