यह प्रक्रिया है। यह प्रीप्रोसेसर को निर्दिष्ट फ़ाइल को संसाधित करने के लिए निर्देश देता है, और परिणाम को आउटपुट में सम्मिलित करता है।
तो A
B
और C
शामिल है, और B
C
, शामिल A
के लिए पूर्वप्रक्रमक के उत्पादन C
की संसाधित पाठ दो बार शामिल होंगे।
यह एक समस्या है, क्योंकि इसके परिणामस्वरूप डुप्लिकेट घोषणाएं होंगी। प्रीप्रोसेसर वैरिएबल का उपयोग करने का एक उपाय यह है कि क्या स्रोत कोड शामिल किया गया है (उर्फ हेडर गार्ड)।
#ifndef EXAMPLE_H
#define EXAMPLE_H
// header contents
#endif
पहली बार, EXAMPLE_H
अपरिभाषित है, और पूर्वप्रक्रमक ifndef
/endif
ब्लॉक के भीतर सामग्री का मूल्यांकन करेंगे। दूसरी बार, यह उस ब्लॉक को छोड़ देगा। तो संसाधित आउटपुट बदलता है, और परिभाषा केवल एक बार शामिल होती है।
#pragma once
// header contents
आप पता लगा सकते हैं कि कैसे पोर्टेबल आप अपने सी हैं:
यह इतना आम एक गैर मानक निर्देश कुछ compilers कि कम है और एक अद्वितीय पूर्वप्रक्रमक चर चुनने की आवश्यकता नहीं है द्वारा कार्यान्वित है कि वहाँ है/सी ++ कोड, और कौन सा हेडर गार्ड उपयोग करने के लिए।
शीर्षलेख गार्ड यह सुनिश्चित करेंगे कि प्रत्येक शीर्षलेख फ़ाइल की सामग्री एक बार अनुवाद इकाई के लिए प्रीप्रोसेस्ड कोड में मौजूद हो।
संकलन
संकलक अपने preprocessed C/C++ से मशीन कोड उत्पन्न करता है।
आम तौर पर, हेडर फ़ाइलों में केवल घोषणाएं शामिल होती हैं, न कि वास्तविक परिभाषाएं (उर्फ कार्यान्वयन)। कंपाइलर में किसी भी चीज के लिए एक प्रतीक तालिका शामिल है जो वर्तमान में परिभाषा खो रही है।
लिंकर को लिंक वस्तु फ़ाइलों को जोड़ती है। यह प्रतीक तालिका के संदर्भों के साथ परिभाषाओं (उर्फ कार्यान्वयन) से मेल खाता है।
यह हो सकता है कि दो ऑब्जेक्ट फ़ाइलें परिभाषा प्रदान करें, और लिंकर एक ले जाएगा।ऐसा होता है यदि आपने अपने शीर्षकों में निष्पादन योग्य कोड डाला है। यह आम तौर पर सी में नहीं होता है, लेकिन यह टेम्पलेट्स के कारण सी ++ में अक्सर होता है।
हैडर "कोड", घोषणाओं या परिभाषाओं कि क्या, सब वस्तु फ़ाइलों में कई बार शामिल किया गया है लेकिन लिंकर कि सभी को एक साथ विलीन हो जाती है, इतना है कि यह निष्पादन में एक बार ही मौजूद है। (मैं इनलाइन कार्यों को छोड़ रहा हूं, जो कई बार मौजूद हैं।)
* "एक हेडर फ़ाइल (गार्ड शामिल करने के साथ) केवल एक बार एक अनुवाद इकाई में शामिल हो जाएगी लेकिन पूरे कोड में कई बार। क्या यह सच है ?"* हाँ। प्रति कार्यक्रम एक बार नहीं, यह प्रति अनुवाद इकाई में एक बार (अधिकतर) है। – CoryKramer
गार्ड शामिल करने के साथ, शीर्षलेख को अभी भी एक अनुवाद इकाई में कई बार शामिल किया जा सकता है - लेकिन इसमें से अधिकांश (गार्ड के भीतर हिस्सा) पहली बार छोड़ा जाएगा। प्रीप्रोसेसर इस बात पर परवाह नहीं करता है कि इसे पहले कहाँ शामिल किया गया था ... केवल तभी गार्ड के मैक्रो को परिभाषित किया गया है (यदि गार्ड सही तरीके से स्थापित होते हैं तो पहली बार इसमें शामिल होता है)। – Dmitri
धन्यवाद। मुझे इस साइट से प्यार है :) सुपर फास्ट प्रतिक्रियाएं और महान जवाब। – Engineer999