c++ - When is it useful to include the same header multiple times in one file? -
इस सवाल का पहले से ही एक उत्तर है: < / P>
- 6 जवाब
मैं कई inclusions के बारे में पढ़ रहा था एक ही शीर्षक में एक फ़ाइल में, और एक दिलचस्प कथन () मिला:
हेडर फाइलों के साथ कुछ युक्तियां हैं जिन्हें आप जान-बूझकर कई बार शामिल करते हैं (यह वास्तव में एक उपयोगी सुविधा प्रदान करता है )।
मैं समझता हूं कि ये गुब्बारे शायद वास्तविक दुनिया की परियोजनाओं में अवांछित और भ्रामक हैं (खासकर जब लोग कई संलयनों की तरह सावधानियां लेते हैं, जैसे और)। लेकिन फिर भी, उन गुम क्या हैं? मैं कुछ विचारों के साथ आया था, लेकिन कुछ वास्तविक उदाहरण (आदर्श रूप से, सुरक्षित और प्रयास किए गए) को देखना चाहूंगा।
मेरा विचार:
- सी में छद्म टेम्पलेट्स, जहां टेम्प्लेट पैरामीटर पूर्वप्रक्रमक परिभाषाओं के साथ प्रतिस्थापित किए गए हैं यह बिना समावेशन के किया जा सकता है, लेकिन फ़ंक्शंस बहुत बड़ा या बहुत अधिक हो सकता है, इसलिए एक अलग फाइल बनाने का मतलब होगा।
- ब्लॉक-बाय-ब्लॉक संरचना / श्रेणी निर्माण (टुकड़ों का समापन) यह सी में विरासत का अनुकरण करने में मदद कर सकता है और सामान्य सदस्यों के साथ स्ट्रैक्ट को परिभाषित करते समय कोड दोहराव को रोकने में मदद कर सकता है।
- लुक-अप तालिकाओं और अन्य संकलन-समय डेटा संरचना (फिर से, पूर्वप्रक्रमक परिभाषाओं की सहायता से)।
#include "file" का मतलब हैडर फ़ाइल लेना और
#include लाइन के बजाय इसकी सामग्री की।
हम आमतौर पर टाइप परिभाषाओं के लिए हेडर्स का इस्तेमाल करते हैं और एक स्रोत फाइलों में आगे घोषणाओं को जोड़ने के लिए। एक ही प्रकार की फ़ाइल को दो बार परिभाषित करना (एक परिपत्र में हमेशा इसका कारण होगा) संकलन त्रुटि देता है, इसलिए हम
#ifndef या
#pragma once का उपयोग करते हैं। (या दोनों)
लेकिन हम एक दोहराए गए कोड और मैक्रोज़ को भी डाल सकते हैं और एक ही फ़ाइल में भी कई बार इसमें शामिल कर सकते हैं। ऐसे मामले में, हम
#ifndef और
#pragma once का उपयोग नहीं करेंगे। यदि आप ऐसा करते हैं तो आपको अतिरिक्त सावधान रहना होगा, और यह केवल तभी करें जब आप जानते हों कि आप क्या कर रहे हैं।
उदाहरण के लिए: यदि कुछ ओएस में एक विशिष्ट सिस्टम फ़ंक्शन (या यहां तक कि एसी मैक्रो की तरह:
offsetof ) चेतावनियों का एक गुच्छा पैदा करता है, और यह आपको परेशान कर रहा है, और आपको यकीन है कि आपका कोड अच्छा है, लेकिन आप उन सभी चेतावनियों को अक्षम नहीं करना चाहते सभी प्रोजेक्ट या फ़ाइल, जब आप विशिष्ट फ़ंक्शन को कॉल करते हैं, तो आप इसे अक्षम करना चाहते हैं।
// चेतावनियों को दबाएं: #if परिभाषित (__ जीएनयूसी__) #if __GNUC__ & gt; 4 || (__GNUC__ == 4 & amp; __GNUC_MINOR__ & gt; = 6) #pragma जीसीसी डायग्नोस्टिक पुश #प्रग्राम जीसीसी निदान पर ध्यान नहीं दिया "-वर्र्डर" #pragma जीसीसी निदान उपेक्षित "-वियोग-फ़ंक्शन" #pragma जीसीसी निदान की उपेक्षा "-वियुन्ड-चर "#प्रगमा जीसीसी निदान की उपेक्षा" -विज्ञापन-तुलना करें "#प्रगमा जीसीसी निदान पर ध्यान नहीं दिया गया" -वेमय-अनइनिलाइज्ड "#प्रगमा जीसीसी डायग्नॉस्टिक अनदेखी" -वाइसेनेंस-पॉइंट "#एंडिफ #एंडिफ // __GNUC__ // यहां आप फ़ंक्शन कॉल करते हैं .. Func (x, y, z); // अनसुखे: चेतावनी को सामान्य स्थिति में वापस लाने के लिए #if परिभाषित (__ जीएनयूसी__) #if __GNUC__ & gt; 4 || (__GNUC__ == 4 और amp; __GNUC_MINOR__ & gt; = 6) #pragma जीसीसी डायग्नोस्टिक पॉप #endif #endif // __GNUC__
यह आपके कोड को बहुत गंदे दिखने देगा, खासकर अगर आप कई बार फ़ंक्शन बुलाते हैं।
एक संभावित समाधान, (मैं यह सुझाव नहीं दे रहा हूँ कि यह सबसे अच्छा है ...) दो हेडर बनाने, एक में चेतावनियों को दबाने के लिए और दूसरे में दमन को रद्द करें।
उस स्थिति में आपका कोड ऐसा दिख सकता है:
#include "suppress.h" func (x, y, z); #include "unsuppress.h" // .... अधिक कोड यहाँ आओ // अब जब इसे फिर से कॉल: # शामिल "suppress.h" func (x, y, z); #include "unsuppress.h"
Comments
Post a Comment