Навіщо визначати макрос до функції з тим самим іменем?


12

Я знайшов код нижче в 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насправді робить? Коли це потрібно зробити?

Відповіді:


15

Іноді деякі архітектури ядра 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.