首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在capability.h文件中使用符号|& &~和~

在capability.h文件中使用符号|& &~和~
EN

Stack Overflow用户
提问于 2013-01-11 02:15:46
回答 3查看 95关注 0票数 3

我正在读取给定here的文件capability.h

我不清楚如何在函数调用中使用符号|~&&~,它们在做什么

在以下函数调用中使用|

代码语言:javascript
复制
static inline kernel_cap_t cap_combine(const kernel_cap_t a,
                                       const kernel_cap_t b)
{
        kernel_cap_t dest;
        CAP_BOP_ALL(dest, a, b, |);
        return dest;
}

在以下系统调用中使用&

代码语言:javascript
复制
static inline kernel_cap_t cap_intersect(const kernel_cap_t a,
                                         const kernel_cap_t b)
{
        kernel_cap_t dest;
        CAP_BOP_ALL(dest, a, b, &);
        return dest;
}

在以下函数中使用&~

代码语言:javascript
复制
static inline kernel_cap_t cap_drop(const kernel_cap_t a,
                                    const kernel_cap_t drop)
{
        kernel_cap_t dest;
        CAP_BOP_ALL(dest, a, drop, &~);
        return dest;
}

在以下函数中使用~

代码语言:javascript
复制
static inline kernel_cap_t cap_invert(const kernel_cap_t c)
{
        kernel_cap_t dest;
        CAP_UOP_ALL(dest, c, ~);
        return dest;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-11 02:28:08

例如,CAP_BOP_ALL被定义为

代码语言:javascript
复制
#define CAP_BOP_ALL(c, a, b, OP)                                    \
do {                                                                \
        unsigned __capi;                                            \
        CAP_FOR_EACH_U32(__capi) {                                  \
                c.cap[__capi] = a.cap[__capi] OP b.cap[__capi];     \
        }                                                           \
} while (0)

所以“表达式”

代码语言:javascript
复制
CAP_BOP_ALL(dest, a, b, |);

扩展为

代码语言:javascript
复制
do {
        unsigned __capi;
        for (__capi = 0; __capi < _KERNEL_CAPABILITY_U32S; ++__capi) {
                dest.cap[__capi] = a.cap[__capi] | b.cap[__capi];
        }
} while (0);

。尽管原始表达式看起来不像正确的C,但这是因为C解析器只有在预处理器完成时才会得到它,并使它看起来像后一个表达式。

票数 6
EN

Stack Overflow用户

发布于 2013-01-11 02:17:07

显然,这些CAP_的东西不是函数,而是预处理器宏。并且您可以将任何预处理标记传递给宏。

票数 4
EN

Stack Overflow用户

发布于 2013-01-11 02:18:02

这些几乎肯定是预处理器宏,其参数是原始标记,而不是解析为操作符。

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

https://stackoverflow.com/questions/14264571

复制
相关文章

相似问题

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