我发现内核代码中的一些宏定义在扩展前后是相同的.为什么要费力定义这个宏呢?

例如,在/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

推荐答案

如果在正常代码中使用展开到自身的宏将不起作用,但对于#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中有conditionalarch_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,我已经这样做了".

C++相关问答推荐

如何通过Zephyr(Devicetree)在PR Pico上设置UTE 1?

malloc实现:判断正确的分配对齐

getchar读css + z还是返回css?

在C中使用JMP_buf数组进行线程化(在xv6中测试)

在C中包装两个数组?

C语言中神秘的(我认为)缓冲区溢出

Zlib:解压缩大文件导致";无效代码长度设置";错误

Go和C中的数据 struct 对齐差异

为什么我在C代码中得到一个不完整的类型?

如何读取程序中嵌入的数据S自己的ELF?

具有正确标头的C struct 定义问题

有没有办法减少C语言中线程的堆大小?

被调用方函数内部的C-Struct变量,它是指针还是无关紧要

如果类型是新的,offsetof是否与typeof一起工作?

C语言中的指针和多维数组

C/C++编译器可以在编译过程中通过按引用传递来优化按值传递吗?

UEFI 应用程序中的计时器回调仅在 AMI BIOS 中挂起

仅使用其内存地址取消引用 C 中的 struct

将十六进制值或十进制值分配给 uint16_t 有什么区别?

将帧从相机 (/dev/video0) 复制到帧缓冲区 (/dev/fb0) 会产生意外结果