प्रीप्रोसेसर के संबंध में बहुत भ्रम की स्थिति प्रतीत होती है।
कंपाइलर क्या करता है जब वह देखता है #include
कि यह उस लाइन को शामिल की गई फ़ाइलों की सामग्री से बदल देता है, कोई सवाल नहीं पूछा गया।
तो अगर आप a.h
इस सामग्री के साथ एक फ़ाइल है :
typedef int my_number;
और b.c
इस सामग्री के साथ एक फ़ाइल :
#include "a.h"
#include "a.h"
फ़ाइल b.c
को संकलन से पहले प्रीप्रोसेसर द्वारा अनुवादित किया जाएगा
typedef int my_number;
typedef int my_number;
जिसके परिणामस्वरूप एक संकलक त्रुटि होगी, चूंकि प्रकार my_number
दो बार परिभाषित किया गया है। भले ही परिभाषा समान हो लेकिन सी भाषा द्वारा इसकी अनुमति नहीं है।
चूंकि हेडर अक्सर एक से अधिक स्थानों में उपयोग किया जाता है, जिसमें आमतौर पर गार्ड का उपयोग सी में किया जाता है। यह इस तरह दिखता है:
#ifndef _a_h_included_
#define _a_h_included_
typedef int my_number;
#endif
फ़ाइल में b.c
अभी भी हैडर की पूरी सामग्री प्रीप्रोसेस होने के बाद दो बार उसमें होगी। लेकिन दूसरा उदाहरण नजरअंदाज कर दिया जाएगा क्योंकि मैक्रो _a_h_included_
पहले से ही परिभाषित किया गया है।
यह वास्तव में अच्छी तरह से काम करता है, लेकिन इसमें दो कमियां हैं। सबसे पहले शामिल गार्डों को लिखना होगा, और प्रत्येक हेडर में मैक्रो नाम अलग होना चाहिए। और दूसरी बात यह है कि कंपाइलर को अभी भी हेडर फ़ाइल की तलाश करनी है और इसे जितनी बार शामिल किया गया है उतनी बार पढ़ें।
ऑब्जेक्टिव-सी में #import
प्रीप्रोसेसर इंस्ट्रक्शन है (इसे कुछ कंपाइलर्स और ऑप्शंस के साथ C और C ++ कोड के लिए भी इस्तेमाल किया जा सकता है)। यह लगभग वैसा ही है #include
, लेकिन यह आंतरिक रूप से भी नोट करता है कि किस फ़ाइल को पहले ही शामिल किया जा चुका है। #import
लाइन केवल पहली बार यह का सामना करना पड़ा है के लिए नामित किया गया फ़ाइल की सामग्री से बदल दिया है। हर बार उसके बाद इसे नजरअंदाज किया जाता है।