उदाहरण के लिए, मैं हाल ही में इस linux कर्नेल में आया था:
/ * यदि स्थिति सत्य है तो संकलन त्रुटि / * #define BUILD_BUG_ON (स्थिति) ((शून्य) साइज़ोफ़ (char [1 - 2 * !! !! (कंडीशन)]) !!
इसलिए, आपके कोड में, यदि आपके पास कुछ संरचना है, जो आकार में 8 बाइट्स की एक से अधिक होनी चाहिए, तो शायद कुछ हार्डवेयर बाधाओं के कारण, आप कर सकते हैं:
BUILD_BUG_ON ((आकार में ढांचा)% 8)! = 0);
और यह तब तक संकलित नहीं होगा जब तक कि संरचना रहस्य का आकार 8 का एक बहु नहीं है, और यदि यह 8 का गुणक है, तो कोई रनटाइम कोड उत्पन्न नहीं होता है।
एक और चाल मुझे पता है कि "ग्राफिक्स रत्न" पुस्तक से है जो एक ही हेडर फाइल को एक मॉड्यूल में घोषित करने और चर को शुरू करने की अनुमति देता है जबकि अन्य मॉड्यूल उस मॉड्यूल का उपयोग करते हैं, केवल उन्हें बाहरी घोषित करते हैं।
#ifdef DEFINE_MYHEADER_GLOBALS # डेफिन ग्लोबल #define INIT (x, y) (x) = (y) #अन्य # डिफाइन ग्लोबल एक्सटर्नल #define INIT (x, y) #अगर अंत अंतर्राष्ट्रीय आईएनआईटी (एक्स, 0); अंतर्राष्ट्रीय int somefunc (int a, int b);
इसके साथ, कोड जो x और somefunc को परिभाषित करता है:
#define DEFINE_MYHEADER_GLOBALS # \ _ \ _ लोव_हैडर_फिल।
कोड है कि केवल एक्स और somefunc का उपयोग कर रहा है () करता है:
# \ _ \ _ लोव_हैडर_फिल।
तो आपको एक हेडर फ़ाइल मिलती है जो ग्लोबल्स के दोनों उदाहरणों की घोषणा करती है और प्रोटोटाइप की आवश्यकता होती है जहां वे आवश्यक हैं, और इसी एक्सक्लूसिव घोषणाएं।
तो, उन पंक्तियों के साथ आपके पसंदीदा सी प्रोग्रामिंग ट्रिक्स क्या हैं?
BUILD_BUG_ON
मैक्रो के बारे में , #error
अंदर का उपयोग करने में क्या गलत है और #if
?