Pourquoi définir une macro pour une fonction du même nom?


Réponses:


15

Parfois, certaines architectures du noyau Linux ne fournissent pas certaines fonctions, telles que arch_atomic_sub_and_test. Cela permet à ces fonctions d'être fournies conditionnellement sans casser d'autres architectures.

Le #definevous permet de tester l'existence de la fonction avec #ifdef:

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

ou il peut être utilisé pour une erreur si la fonction n'est pas disponible:

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

Par exemple, voici comment il est utilisé dans le noyau Linux (à partir de 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.