我正在读取给定here的文件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;
}发布于 2013-01-11 02:28:08
例如,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-11 02:17:07
显然,这些CAP_的东西不是函数,而是预处理器宏。并且您可以将任何预处理标记传递给宏。
发布于 2013-01-11 02:18:02
这些几乎肯定是预处理器宏,其参数是原始标记,而不是解析为操作符。
https://stackoverflow.com/questions/14264571
复制相似问题