3

我正在阅读此处给出的文件capability.h
我不清楚符号如何在函数调用| ~ &&~使用它们在做什么

|在以下函数调用中使用:

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

3 回答 3

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 解析器仅在预处理器完成时才获取它,并使其看起来像后一个表达式。

于 2013-01-10T18:28:08.097 回答
4

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

于 2013-01-10T18:17:06.607 回答
2

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

于 2013-01-10T18:18:01.987 回答