Por que definir uma macro para uma função com o mesmo nome?


Respostas:


15

Às vezes, algumas arquiteturas no kernel do Linux não fornecem determinadas funções, como arch_atomic_sub_and_test. Isso permite que essas funções sejam fornecidas condicionalmente sem interromper outras arquiteturas.

O #definepermite testar a existência da função com #ifdef:

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

ou pode ser usado para erro se a função não estiver disponível:

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

Por exemplo, é assim que é usado no kernel do Linux (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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.