डबल के उपयोग में C++ में गार्ड शामिल हैं




macros linker (4)

इसका एकमात्र फायदा मुझे यह हो सकता है कि यह फाइल को खोजने के लिए लिंक करने वाले को परेशान करने से रोकता है।

लिंकर किसी भी तरह से प्रभावित नहीं होगा।

यह पूर्व-प्रोसेसर को फ़ाइल खोजने के लिए परेशान करने से रोक सकता है, लेकिन यदि गार्ड को परिभाषित किया गया है, तो इसका मतलब है कि यह पहले ही फ़ाइल ढूंढ चुका है। मुझे संदेह है कि यदि पूर्व-प्रक्रिया का समय बिल्कुल कम हो जाता है, तो सबसे विकृति के पुनरावर्ती रूप से शामिल होने वाले राक्षसीपन को छोड़कर प्रभाव काफी कम होगा।

इसमें एक नकारात्मक पहलू यह है कि यदि गार्ड को कभी भी बदल दिया जाता है (उदाहरण के लिए किसी अन्य गार्ड के साथ संघर्ष के कारण), तो कार्य को शामिल करने के लिए निर्देशों को शामिल करने से पहले सभी शर्तों को बदलना होगा। और अगर कुछ और पिछले गार्ड का उपयोग करता है, तो सही तरीके से काम करने के लिए खुद को शामिल करने के निर्देश के लिए सशर्तियां बदलनी चाहिए।

PS __HEADER_A_HPP__ एक प्रतीक है जो कार्यान्वयन के लिए आरक्षित है, इसलिए यह ऐसा कुछ नहीं है जिसे आप परिभाषित कर सकते हैं। गार्ड के लिए किसी अन्य नाम का उपयोग करें।

इसलिए मैंने हाल ही में एक चर्चा की कि मैं कहां काम करता हूं, जिसमें मैं सवाल कर रहा था कि एक सिंगल गार्ड पर एक डबल का उपयोग शामिल है। डबल गार्ड से मेरा क्या मतलब है:

हेडर फ़ाइल, "शीर्ष लेख_हैप":

#ifndef __HEADER_A_HPP__
#define __HEADER_A_HPP__
...
...
#endif

जब हेडर फ़ाइल कहीं भी हो, हेडर या स्रोत फ़ाइल सहित:

#ifndef __HEADER_A_HPP__
#include "header_a.hpp"
#endif

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

मुझे जो समस्या समझ में नहीं आ रही है, वह है #ifndef __HEADER_A_HPP__ और #endif को #include "header_a.hpp" आसपास उपयोग करने की। मुझे सहकर्मी द्वारा बताया गया है कि यह सुरक्षा की एक दूसरी परत को सम्मिलित करता है, लेकिन मैं यह देखने में विफल रहता हूं कि यदि दूसरी परत पूरी तरह से काम करती है (या क्या?) तो यह दूसरी परत भी उपयोगी है।

इसका एकमात्र फायदा मुझे यह हो सकता है कि यह फाइल को खोजने के लिए लिंक करने वाले को परेशान करने से रोकता है। क्या इसका मतलब संकलन समय में सुधार करना है (जिसका लाभ के रूप में उल्लेख नहीं किया गया था), या यहाँ काम पर कुछ और है जो मैं नहीं देख रहा हूँ?


अधिक पारंपरिक (मेनफ्रेम) प्लेटफार्मों पर पुराने कंपाइलर (हम यहां 2000 के दशक के मध्य से बात कर रहे हैं) का उपयोग अन्य उत्तरों में वर्णित अनुकूलन के लिए नहीं किया गया था, और इसलिए यह वास्तव में हेडर फ़ाइलों को फिर से पढ़ने के लिए प्रीप्रोसेसिंग समय को काफी धीमा करने के लिए उपयोग किया गया था जिसे पहले ही शामिल किया जा चुका है (एक बड़े, अखंड, उद्यम-वाई परियोजना को ध्यान में रखते हुए आप बहुत सारी हेडर फ़ाइलों को शामिल करने जा रहे हैं)। एक उदाहरण के रूप में, मैंने डेटा देखा है जो 256 हेडर फ़ाइलों के साथ एक फ़ाइल के लिए 26-गुना स्पीडअप इंगित करता है, जिसमें प्रत्येक 256 समान फाइलें शामिल हैं, जिसमें AIX कंपाइलर के लिए VisualAge C ++ 6 (जो 2000 के दशक के मध्य से है)। यह एक अतिवादी उदाहरण है, लेकिन इस तरह की गति में वृद्धि होती है।

हालांकि, सभी आधुनिक संकलक, यहां तक ​​कि एआईएक्स और सोलारिस जैसे मेनफ्रेम प्लेटफार्मों पर, हेडर समावेशन के लिए पर्याप्त अनुकूलन करते हैं कि इन दिनों अंतर वास्तव में नगण्य है। इसलिए इन किसी भी अधिक होने का कोई अच्छा कारण नहीं है।

हालांकि, यह समझाता है कि कुछ कंपनियां अभी भी अभ्यास पर क्यों टिकी हुई हैं, क्योंकि अपेक्षाकृत हाल ही में (कम से कम C / C ++ कोडबेस उम्र की शर्तों में) यह अभी भी बहुत बड़ी अखंड परियोजनाओं के लिए सार्थक था।


हालाँकि, लोग इसके खिलाफ बहस कर रहे हैं, लेकिन व्यवहार में '#pragma एक बार' पूरी तरह से काम करता है और मुख्य संकलक (gcc / g ++, vc ++) इसका समर्थन करते हैं।

इसलिए जो भी शुद्ध तर्क लोग फैला रहे हैं, वह बहुत बेहतर काम करता है:

  1. उपवास
  2. कोई रखरखाव नहीं, रहस्यमय गैर-समावेश के साथ कोई परेशानी नहीं क्योंकि आपने एक पुराने झंडे की नकल की
  3. फ़ाइल में फैली स्पष्ट अर्थ बनाम क्रिप्टिक लाइनों के साथ सिंगल लाइन

तो सीधे शब्दों में कहें:

#pragma once

फ़ाइल की शुरुआत में, और यह बात है। अनुकूलित, बनाए रखने और जाने के लिए तैयार।


हेडर फ़ाइल में गार्ड शामिल करने का कारण हेडर की सामग्री को एक से अधिक बार अनुवाद इकाई में खींचने से रोकना है। यह सामान्य, लंबे समय से स्थापित अभ्यास है।

किसी स्रोत फ़ाइल में रेंडर को शामिल करने का कारण एक हेडर फ़ाइल को शामिल करने से बचना है जो कि शामिल की जा रही हेडर फ़ाइल को खोलने से बचना है, और पुराने दिनों में वापस जो संकलन को गति प्रदान कर सकता है। इन दिनों, फ़ाइल खोलना पहले की तुलना में बहुत तेज़ है; इसके अलावा, कंपाइलर यह याद रखने में बहुत स्मार्ट होते हैं कि वे कौन सी फाइलें पहले ही देख चुके हैं, और वे गार्ड आइडियल को शामिल करते हैं, इसलिए यह पता लगा सकते हैं कि उन्हें फिर से फाइल खोलने की जरूरत नहीं है। यह थोड़ा हाथ से लहराता है, लेकिन लब्बोलुआब यह है कि इस अतिरिक्त परत को किसी भी अधिक की आवश्यकता नहीं है।

EDIT: यहाँ एक और पहलू यह है कि C ++ को संकलित करना C को संकलित करने की तुलना में कहीं अधिक जटिल है, इसलिए इसमें अधिक समय लगता है, खुलने में लगने वाले समय में फ़ाइलों को अनुवाद इकाई संकलित करने में लगने वाला एक छोटा, कम महत्वपूर्ण हिस्सा शामिल होता है।





linker