为什么要为具有相同名称的函数定义宏?

时间:2019-12-10 13:01:19

标签: 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

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

1 个答案:

答案 0 :(得分:14)

有时候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

,或者如果该功能不可用,则可用于出错:

#ifndef arch_atomic_sub_and_test
# error "arch_atomic_sub_and_test not available"
#endif

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

#ifdef arch_atomic_sub_and_test
#define atomic_sub_and_test atomic_sub_and_test
static __always_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);
}
#endif