使用符号| &安培; &〜和〜在capability.h文件中

时间:2013-01-10 18:15:46

标签: c linux-kernel posix embedded-linux

我正在阅读文件capability.h给出here
我不清楚符号| ~ &&~如何在函数调用中使用它们在

中执行的操作

在以下函数调用中使用|

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;
}

在以下系统调用中使用&

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;
}

在以下功能中使用&~

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;
}

在以下功能中使用~

static inline kernel_cap_t cap_invert(const kernel_cap_t c)
{
        kernel_cap_t dest;
        CAP_UOP_ALL(dest, c, ~);
        return dest;
}

3 个答案:

答案 0 :(得分:6)

例如,CAP_BOP_ALL定义为

#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)

所以“表达”

CAP_BOP_ALL(dest, a, b, |);

扩展为

do {
        unsigned __capi;
        for (__capi = 0; __capi < _KERNEL_CAPABILITY_U32S; ++__capi) {
                dest.cap[__capi] = a.cap[__capi] | b.cap[__capi];
        }
} while (0);

。尽管原始表达式看起来不像正确的C,但这是因为C语法分析器只在预处理器完成时获取它并使其看起来像后一个表达式。

答案 1 :(得分:4)

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

答案 2 :(得分:2)

这些几乎可以肯定是预处理器宏,其参数是原始令牌,而不是解析为运算符。