एक मैक्रो को उसी नाम से फ़ंक्शन में क्यों परिभाषित करें?


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

कभी-कभी लिनक्स कर्नेल में कुछ आर्किटेक्चर कुछ कार्य प्रदान नहीं करते हैं, जैसे कि 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

उदाहरण के लिए, यह कैसे लिनक्स कर्नेल में प्रयोग किया जाता है (से 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.