如果在正常代码中使用展开到自身的宏将不起作用,但对于#ifdef
、#ifndef
和#if defined
,它将被视为已定义的宏.
当您希望将某个标识符not定义为宏,但又希望能够根据是否定义了该标识符来有条件地编译代码时,这很有用.这似乎就是在您的示例中发生的事情;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
经过预处理后,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);
}
同时,在include/linux/atomic-arch-fallback.h
中有conditional对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
因此,arch/arm64/include/asm/atomic.h
中的#define
的意义是告诉include/linux/atomic-arch-fallback.h
"不要定义arch_atomic_add_return
,我已经这样做了".