为什么内核使用前后扩展相同的宏定义?

Fro*_*ter 2 c macros compilation linux-kernel

我发现内核代码中的一些宏定义展开前后是一样的。为什么要这么麻烦地定义这个宏呢?

例如,在/arch/arm64/include/asm/atomic.h中:

#define arch_atomic_add_return_relaxed      arch_atomic_add_return_relaxed
#define arch_atomic_add_return_acquire      arch_atomic_add_return_acquire
#define arch_atomic_add_return_release      arch_atomic_add_return_release
#define arch_atomic_add_return              arch_atomic_add_return
Run Code Online (Sandbox Code Playgroud)

zwo*_*wol 6

如果在普通代码中使用,扩展为自身的宏没有任何效果,但它算作#ifdef#ifndef和 的定义宏#if defined

当您想要将某些标识符定义为作为宏,但您还希望能够根据该标识符是否已定义来有条件地编译代码时,这非常有用。这就是你的例子中发生的事情;arch/arm64/include/asm/atomic.h将您引用的宏定义与具体定义(扩展为的宏)配对作为内联函数:

#define ATOMIC_FETCH_OP(name, op)                                       \
static __always_inline int arch_##op##name(int i, atomic_t *v)          \
{                                                                       \
        return __lse_ll_sc_body(op##name, i, v);                        \
}

#define ATOMIC_FETCH_OPS(op)                                            \
        ATOMIC_FETCH_OP(_relaxed, op)                                   \
        ATOMIC_FETCH_OP(_acquire, op)                                   \
        ATOMIC_FETCH_OP(_release, op)                                   \
        ATOMIC_FETCH_OP(        , op)

ATOMIC_FETCH_OPS(atomic_add_return)

#define arch_atomic_add_return_relaxed          arch_atomic_add_return_relaxed
#define arch_atomic_add_return_acquire          arch_atomic_add_return_acquire
#define arch_atomic_add_return_release          arch_atomic_add_return_release
#define arch_atomic_add_return                  arch_atomic_add_return
Run Code Online (Sandbox Code Playgroud)

预处理后的定义arch_atomic_add_return将类似于

static inline __attribute__((always_inline))
int arch_atomic_add_return(int i, atomic_t *v)
{
    return __lse_ll_sc_body(atomic_add_return, i, v);
}
Run Code Online (Sandbox Code Playgroud)

同时,里面include/linux/atomic-arch-fallback.h有一个条件定义arch_atomic_add_return

#ifndef arch_atomic_add_return
static __always_inline int
arch_atomic_add_return(int i, atomic_t *v)
{
    int ret;
    __atomic_pre_full_fence();
    ret = arch_atomic_add_return_relaxed(i, v);
    __atomic_post_full_fence();
    return ret;
}
#define arch_atomic_add_return arch_atomic_add_return
#endif
Run Code Online (Sandbox Code Playgroud)

#define因此, in的重点arch/arm64/include/asm/atomic.h是告诉include/linux/atomic-arch-fallback.h“不要定义arch_atomic_add_return,我已经这样做了”。