Perché definire una macro con una funzione con lo stesso nome?


Risposte:


15

A volte alcune architetture nel kernel Linux non forniscono determinate funzioni, come ad esempio arch_atomic_sub_and_test. Ciò consente a queste funzioni di essere fornite in modo condizionale senza interrompere altre architetture.

Ciò #defineconsente di verificare l'esistenza della funzione con #ifdef:

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

oppure può essere utilizzato per errori se la funzione non è disponibile:

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

Ad esempio, ecco come viene utilizzato nel kernel Linux (da 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.