Warum ein Makro für eine Funktion mit demselben Namen definieren?

Antworten:

15

Manchmal bieten einige Architekturen im Linux-Kernel bestimmte Funktionen nicht an, z arch_atomic_sub_and_test. Dadurch können diese Funktionen bedingt bereitgestellt werden, ohne andere Architekturen zu beschädigen.

Mit #definekönnen Sie die Existenz der Funktion testen mit #ifdef:

#ifdef arch_atomic_sub_and_test
// use arch_atomic_sub_and_test
#else
// some other equivalent code
#endif

oder es kann verwendet werden, um Fehler zu machen, wenn die Funktion nicht verfügbar ist:

#ifndef arch_atomic_sub_and_test
# error "arch_atomic_sub_and_test not available"
#endif

So wird es beispielsweise im Linux-Kernel (von include/asm-generic/atomic-instrumented.h) verwendet:

#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
SS Anne
quelle