为什么要为同名函数定义宏?

Jus*_*oob 12 c linux-kernel

我在https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/atomic.h 中找到了下面的代码

static __always_inline bool arch_atomic_sub_and_test(int i, atomic_t *v)
{
        return GEN_BINARY_RMWcc(LOCK_PREFIX "subl", v->counter, e, "er", i);
}
#define arch_atomic_sub_and_test arch_atomic_sub_and_test
Run Code Online (Sandbox Code Playgroud)

什么是#define真的?什么时候需要这样做?

JL2*_*210 15

有时,Linux 内核中的某些架构不提供某些功能,例如arch_atomic_sub_and_test. 这允许在不破坏其他架构的情况下有条件地提供这些功能。

#define让您测试与功能的存在#ifdef

#ifdef arch_atomic_sub_and_test
// use arch_atomic_sub_and_test
#else
// some other equivalent code
#endif
Run Code Online (Sandbox Code Playgroud)

或者如果函数不可用,它可用于出错:

#ifndef arch_atomic_sub_and_test
# error "arch_atomic_sub_and_test not available"
#endif
Run Code Online (Sandbox Code Playgroud)

例如,这就是它在 Linux 内核中的使用方式(来自include/asm-generic/atomic-instrumented.h):

#if defined(arch_atomic_sub_and_test)
static inline bool
atomic_sub_and_test(int i, atomic_t *v)
{
        kasan_check_write(v, sizeof(*v));
        return arch_atomic_sub_and_test(i, v);
}
#define atomic_sub_and_test atomic_sub_and_test
#endif
Run Code Online (Sandbox Code Playgroud)