c - अगर यह पहले से ही परिभाषित नहीं है तो केवल एक मैक्रो को क्यों परिभाषित करें?




macros c-preprocessor (5)

हमारे सभी सी कोड बेस में, मुझे लगता है कि प्रत्येक मैक्रो निम्न तरीके से परिभाषित है:

#ifndef BEEPTRIM_PITCH_RATE_DEGPS
#define BEEPTRIM_PITCH_RATE_DEGPS                   0.2f
#endif

#ifndef BEEPTRIM_ROLL_RATE_DEGPS
#define BEEPTRIM_ROLL_RATE_DEGPS                    0.2f
#endif

#ifndef FORCETRIMRELEASE_HOLD_TIME_MS
#define FORCETRIMRELEASE_HOLD_TIME_MS               1000.0f
#endif

#ifndef TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS
#define TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS       50.0f
#endif

सिर्फ मैक्रोज़ को परिभाषित करने के बजाय इन परिभाषित चेकों को करने का औचित्य क्या है?

#define BEEPTRIM_PITCH_RATE_DEGPS                   0.2f
#define BEEPTRIM_ROLL_RATE_DEGPS                    0.2f
#define FORCETRIMRELEASE_HOLD_TIME_MS               1000.0f
#define TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS       50.0f

मैं इस प्रथा को वेब पर कहीं भी स्पष्ट नहीं कर सकता।


आप एक ऐसे ढांचे / पुस्तकालय के बारे में सोच सकते हैं जो उपयोगकर्ता को एक डिफ़ॉल्ट प्रीसेट देता है जो उपयोगकर्ता को उस पर संकलन और काम करने की अनुमति देता है। वे परिभाषित अलग-अलग फ़ाइलों में फैले हुए हैं और अंतिम उपयोगकर्ता को सलाह दी जाती है कि वह इसे config.h फ़ाइल में शामिल करे जहाँ वह अपने मूल्यों को कॉन्फ़िगर कर सके। यदि उपयोगकर्ता कुछ परिभाषित करता है तो सिस्टम प्रीसेट के कारण काम करना जारी रख सकता है।


ऐसा इसलिए किया जाता है ताकि हेडर फ़ाइल का उपयोगकर्ता अपने कोड से या कंपाइलर -D फ्लैग से परिभाषाओं को ओवरराइड कर सके।


कोई भी सी परियोजना कई स्रोत फ़ाइलों पर रहती है। जब एक एकल स्रोत फ़ाइल पर काम करते हैं, तो चेक (और वास्तव में) का कोई मतलब नहीं होता है, लेकिन जब एक बड़े सी प्रोजेक्ट पर काम करते हैं, तो एक निरंतरता को परिभाषित करने से पहले मौजूदा परिभाषित करने के लिए जांच करना अच्छा अभ्यास है। यह विचार सरल है: आपको उस विशिष्ट स्रोत फ़ाइल में स्थिरांक की आवश्यकता है, लेकिन यह पहले से ही दूसरे में परिभाषित हो सकता है।


जब आप संकलन कर रहे हों तो यह आपको मैक्रोज़ को ओवरराइड करने की अनुमति देता है:

gcc -DMACRONAME=value

शीर्ष लेख फ़ाइल में परिभाषाएँ डिफ़ॉल्ट के रूप में उपयोग की जाती हैं।


मुझे संदर्भ नहीं पता है लेकिन इसका उपयोग उपयोगकर्ता को उन स्थूल परिभाषाओं द्वारा निर्धारित मूल्यों को ओवरराइड करने के लिए उपलब्धता प्रदान करने के लिए किया जा सकता है। यदि उपयोगकर्ता स्पष्ट रूप से उन मैक्रोज़ में से किसी के लिए एक अलग मान निर्धारित करता है, तो इसका उपयोग यहां उपयोग किए गए मानों के बजाय किया जाएगा।

उदाहरण के लिए g ++ में आप किसी मैक्रो को मान देने के लिए संकलन के दौरान -D ध्वज का उपयोग कर सकते हैं।






ifndef