Đôi khi một số kiến trúc trong nhân Linux không cung cấp các chức năng nhất định, chẳng hạn như arch_atomic_sub_and_test
. Điều này cho phép các chức năng này được cung cấp có điều kiện mà không phá vỡ các kiến trúc khác.
Các #define
cho phép bạn kiểm tra cho sự tồn tại của hàm với #ifdef
:
#ifdef arch_atomic_sub_and_test
// use arch_atomic_sub_and_test
#else
// some other equivalent code
#endif
hoặc nó có thể được sử dụng để báo lỗi nếu chức năng không khả dụng:
#ifndef arch_atomic_sub_and_test
# error "arch_atomic_sub_and_test not available"
#endif
Ví dụ: đây là cách nó được sử dụng trong nhân Linux (từ 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