เหตุใดจึงกำหนดแมโครให้กับฟังก์ชันด้วยชื่อเดียวกัน


12

ฉันพบรหัสด้านล่างใน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ทำจริงๆ? เมื่อใดที่จำเป็นต้องทำ

คำตอบ:


15

บางครั้งสถาปัตยกรรมบางอย่างใน Linux Kernel 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.