Tại sao định nghĩa một macro cho một hàm có cùng tên?


12

Tôi tìm thấy mã dưới đây trong 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

những gì #definethực sự làm? Khi nào cần thiết phải làm như vậy?

Câu trả lời:


15

Đô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 #definecho 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.