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 に答える