स्वचालित डुप्लिकेट-हेडर अपवर्जन के साथ एक कठिनाई यह है कि सी मानक इस बात पर अपेक्षाकृत मौन है कि फाइलनाम में क्या शामिल है। उदाहरण के लिए, मान लीजिए कि संकलित की जा रही मुख्य फ़ाइल में निर्देश हैं #include "f1.h"
और #include "f2.h"
, और उन निर्देशों के लिए मिली फ़ाइलों में दोनों हैं #include "f3.h"
। तो f1.h
और f2.h
अलग निर्देशिका में हैं, लेकिन खोज के द्वारा पाया गया, पथ शामिल तो यह स्पष्ट नहीं किया जाएगा #include
उन फ़ाइलों के भीतर निर्देशों ही लोड करने का इरादा कर रहे थे f3.h
फ़ाइल, या अलग-अलग।
यदि रिश्तेदारों के रास्तों सहित फाइलों को शामिल करने की संभावनाओं में कोई कमी आती है तो हालात और भी खराब हो जाते हैं। कुछ मामलों में जहां हेडर फाइलें नेस्टेड के लिए सापेक्ष पथों का उपयोग करती हैं, में निर्देश शामिल होते हैं, और जहां एक इच्छा आपूर्ति की गई हेडर फ़ाइलों में कोई भी बदलाव करने से बचती है, किसी प्रोजेक्ट के डायरेक्टरी स्ट्रक्चर के भीतर कई स्थानों पर हेडर फाइल को डुप्लिकेट करना आवश्यक हो सकता है। भले ही उस हेडर फ़ाइल की कई भौतिक प्रतियां मौजूद हों, उन्हें शब्दार्थ माना जाना चाहिए, क्योंकि वे एक ही फाइल हैं।
यदि #pragma once
निर्देश ने एक पहचानकर्ता को once
शब्दार्थ के साथ पालन करने की अनुमति दी है , तो संकलक को फ़ाइल को छोड़ देना चाहिए यदि पहचानकर्ता पहले से सामने वाले #pragma once
निर्देश से एक से मेल खाता है , तो शब्दार्थ अस्पष्ट होगा; एक संकलक जो बता सकता है कि एक #include
निर्देश उसी #pragma once
-tagged फ़ाइल को पहले के रूप में लोड करेगा , यह फ़ाइल को फिर से खोले बिना इसे थोड़ा समय बचाने के लिए बचा सकता है, लेकिन इस तरह का पता लगाना बहुत महत्वपूर्ण नहीं होगा क्योंकि फ़ाइल स्केच होगी या नहीं या फ़ाइलनाम को मैच के रूप में मान्यता दी गई थी। मैं उस तरह से काम करने वाले किसी भी कंपाइलर से अनजान हूँ, हालाँकि। संकलक का निरीक्षण करना कि क्या कोई फ़ाइल पैटर्न से मेल खाती है #ifndef someIdentifier / #define someIdentifier / #endif [for that ifndef] / nothing following
और इस तरह की चीज़ को उपरोक्त के बराबर मानती है #pragma once someIdentifier
या नहींsomeIdentifier
परिभाषित किया गया है, अनिवार्य रूप से अच्छा है।
#pragma once
जो केवल उस फाइल को एक बार शामिल करता है।