[c] 같은 이름의 함수에 매크로를 정의해야하는 이유는 무엇입니까?

https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/atomic.h 에서 아래 코드를 찾았습니다.

static __always_inline bool arch_atomic_sub_and_test(int i, atomic_t *v)
{
        return GEN_BINARY_RMWcc(LOCK_PREFIX "subl", v->counter, e, "er", i);
}
#define arch_atomic_sub_and_test arch_atomic_sub_and_test

무엇을 않는 #define정말로? 언제해야합니까?



답변

Linux 커널의 일부 아키텍처는와 같은 특정 기능을 제공하지 않는 경우가 arch_atomic_sub_and_test있습니다. 이를 통해 다른 아키텍처를 중단하지 않고도 이러한 기능을 조건부로 제공 할 수 있습니다.

다음을 #define사용하여 함수의 존재를 테스트 할 수 있습니다 #ifdef.

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

또는 기능을 사용할 수없는 경우 오류를 발생시키는 데 사용할 수 있습니다.

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

예를 들어, 다음은 Linux 커널에서 (에서 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


답변