¿Por qué definir una macro a una función con el mismo nombre?

Respuestas:

15

A veces, algunas arquitecturas en el kernel de Linux no proporcionan ciertas funciones, como arch_atomic_sub_and_test. Esto permite que estas funciones se proporcionen condicionalmente sin romper otras arquitecturas.

El le #definepermite probar la existencia de la función con #ifdef:

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

o se puede usar para error si la función no está disponible:

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

Por ejemplo, así es como se usa en el kernel de Linux (desde 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
SS Anne
fuente