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

标签 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 的真正作用是什么?什么时候需要这样做?

最佳答案

有时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):

#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

关于c - 为什么要为同名函数定义宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59267835/

相关文章:

c - 使用 SSE Intrinsics 进行大小为 100*100 的矩阵乘法

c - 需要解释 C 函数及其返回类型

git - 如何从git获取特定内核版本到外向数字

linux-kernel - 如何使用 ftrace 获取系统调用调用的内核调用图?

linux - 使用结构来设置功能

python - 如何使用 twenacl 交换和验证临时公钥?

c - Linux 共享内存段故障

在 C 中使用多线程服务器时无法完成文件传输

c++ - 如何用C/C++获取硬盘的运行时间

android - 使用 Android NDK 构建 VPNC