【问题标题】:Why define a macro to a function with the same name?为什么要为同名的函数定义宏?
【发布时间】:2020-01-06 20:44:50
【问题描述】:

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

【问题讨论】:

    标签: c linux-kernel


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 2016-02-10
      • 2017-07-08
      相关资源
      最近更新 更多