Po co definiować makro do funkcji o tej samej nazwie?


Odpowiedzi:


15

Czasami niektóre architektury w jądrze Linuksa nie zapewniają pewnych funkcji, takich jak arch_atomic_sub_and_test. Pozwala to warunkowo udostępniać te funkcje bez naruszania innych architektur.

#definePozwala testować na istnienie funkcji o #ifdef:

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

lub można go użyć do błędu, jeśli funkcja nie jest dostępna:

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

Na przykład, tak to jest używane w jądrze Linuksa (z 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.