परिचय
इस ट्यूटोरियल में हम Ubuntu सिस्टम पर C प्रीप्रोसेसर यानी cpp यूटिलिटी के आंतरिक संचालन और व्यवहार को व्यवहारिक उदाहरणों से समझेंगे। सोर्स कोड निर्माण के दौरान मैक्रो एक्सपेंशन, कंडीशनल कंपाइलेशन ट्रैकिंग और हेडर डायरेक्टरी रूटिंग जैसी आवश्यक प्रीप्रोसेसिंग तकनीकों का गहराई से विश्लेषण किया जाएगा।
प्रीप्रोसेसर इंस्टॉलेशन व बुनियादी संस्करण सत्यापन
प्रैक्टिकल लैब तैयार करने के लिए सबसे पहले सिस्टम रिपॉजिटरी अपडेट करें और बिल्ड टूल्स सुनिश्चित करने हेतु apt-get update -qq && apt-get install -y gcc रन करें।

सिस्टम में C प्रीप्रोसेसर बाइनरी की सटीक डायरेक्टरी लोकेशन का पता लगाने के लिए which cpp कमांड का प्रयोग करें।
कंसोल आउटपुट /usr/bin/cpp यह दर्शाता है कि स्टैंडर्ड एग्जीक्यूटेबल पाथ में टूल का बाइनरी या सिंबोलिक लिंक सही ढंग से मौजूद है।

स्थापित GNU प्रीप्रोसेसर के बिल्ड विवरण और सक्रिय वर्शन की पुष्टि के लिए cpp --version निष्पादित करें।
परिणाम से स्पष्ट होता है कि Ubuntu पर 13.3.0 वर्शन पूरी तरह कॉन्फ़िगर हो चुका है और उपयोग के लिए तैयार है।
⚙️ [महत्वपूर्ण कमांड-लाइन फ्लैग्स]
-D name : सोर्स कोड में सशर्त कंपाइलेशन अथवा कॉन्स्टेंट वैल्यू हेतु नया मैक्रो रजिस्टर करता है।-U name : पहले से तय या डिफॉल्ट सिस्टम मैक्रो की परिभाषा को समाप्त करता है।-I dir : हेडर फाइलों (#include) की खोज हेतु अतिरिक्त डायरेक्टरी पाथ जोड़ता है।-dM : प्रीप्रोसेसिंग एनवायरनमेंट में एक्टिव सभी मैक्रोज़ की पूरी सूची प्रदर्शित करता है।-dD : जनरेटेड कोड के साथ सभी #define डायरेक्टिव्स को भी आउटपुट में बनाए रखता है।-P : आउटपुट में लाइन-नंबर डिबगिंग मार्कर (#line) जोड़ने पर रोक लगाता है।-v : हेडर सर्च पाथ्स और आंतरिक निष्पादन का विस्तृत लॉग दिखाता है।

मैक्रो एक्सपेंशन और सोर्स कोड ट्रांसफॉर्मेशन
अभ्यास के लिए एक पृथक टेस्ट डायरेक्टरी तैयार करने और उसमें स्विच करने हेतु mkdir -p ~/cpp_practice && cd ~/cpp_practice कमांड चलाएं।

कॉन्स्टेंट और फ़ंक्शन-नुमा मैक्रोज़ के प्रतिस्थापन की जांच करने के लिए printf '#define BUFFER_SIZE 1024\n#define SQUARE(x) ((x) * (x))\nint limit = BUFFER_SIZE;\nint area = SQUARE(5);\n' > macro_test.c द्वारा एक टेस्ट C फाइल बनाएं।

तैयार सोर्स कोड पर प्रीप्रोसेसर रन करके एक्सपैंडेड परिणाम को नई फाइल में सहेजने के लिए cpp macro_test.c output.i एग्जीक्यूट करें।
इस प्रक्रिया में सभी टोकन और मैक्रोज़ अपने अंतिम मानों में ट्रांसफॉर्म होकर इंटरमीडिएट फाइल में सेव हो जाते हैं।

उत्पन्न इंटरमीडिएट फाइल से कंपाइलर लाइन मार्करों (#) को फिल्टर करके केवल शुद्ध C कोड देखने के लिए cat output.i | grep -v '^#' चलाएं।
यहां स्पष्ट दिखाई देता है कि BUFFER_SIZE सीधे 1024 बन चुका है तथा SQUARE(5) सटीक रूप से ((5) * (5)) व्यंजक में बदल गया है।

CLI से मैक्रो इंजेक्शन एवं सशर्त कंपाइलेशन (-D, -U)
अगले चरण के परीक्षणों को जारी रखने के लिए cd ~/cpp_practice द्वारा कार्यशील डायरेक्टरी में प्रवेश करें।

ब्रांचिंग लॉजिक के सत्यापन हेतु printf '#ifdef DEBUG\nconst char *status = "DEBUG_ENABLED";\n#else\nconst char *status = "PRODUCTION";\n#endif\n' > condition_test.c कमांड से कंडीशनल कोड स्ट्रक्चर तैयार करें।

कमांड-लाइन से सीधे DEBUG फ्लैग डिफाइन करने और स्वच्छ आउटपुट प्राप्त करने के लिए cpp -DDEBUG -P condition_test.c निष्पादित करें।-D फ्लैग द्वारा इंजेक्ट किए गए मैक्रो के कारण प्रीप्रोसेसर #ifdef ब्लॉक को मान्य मानते हुए const char *status = "DEBUG_ENABLED"; स्टेटमेंट का चयन करता है।

अब उसी कोड को बिना किसी फ्लैग के प्रोसेस करने के लिए cpp -UDEBUG -P condition_test.c का इस्तेमाल करें, जिससे मैक्रो अनडिफाइन हो जाए।
परिणामस्वरूप डिबग स्थिति अमान्य हो जाती है और फॉलबैक #else ब्लॉक निष्पादित होकर const char *status = "PRODUCTION"; कोड प्रदर्शित होता है।

कस्टम हेडर पाथ मैपिंग और क्लीन कोड जेनरेशन (-I, -P)
हेडर रिजॉल्यूशन टेस्ट शुरू करने हेतु cd ~/cpp_practice चलाकर मुख्य टेस्ट फ़ोल्डर में रहें।

कस्टम हेडर फाइलों को पृथक रखने के उद्देश्य से mkdir -p custom_headers द्वारा एक नया सब-फोल्डर बनाएं।

एप्लिकेशन के वर्शन मैक्रो को स्टोर करने के लिए echo '#define APP_VERSION "1.0.0"' > custom_headers/version.h कमांड चलाकर हेडर फाइल बनाएं।

इस बाहरी हेडर को लोड करने वाला मेन प्रोग्राम तैयार करने हेतु printf '#include "version.h"\nconst char *ver = APP_VERSION;\n' > main_app.c रन करें।

कस्टम डायरेक्टरी को इन्क्लूड पाथ में जोड़ते हुए स्वच्छ आउटपुट के लिए cpp -I./custom_headers -P main_app.c निष्पादित करें।-I फ्लैग के जरिए कंपाइलर नॉन-स्टैंडर्ड फोल्डर से version.h को सफलतापूर्वक लोकेट कर लेता है, जबकि -P विकल्प अनावश्यक लाइन-नंबर मेटाडेटा हटाकर सीधे रिज़ॉल्व किया गया कोड const char *ver = "1.0.0"; प्रस्तुत करता है।

इस गाइड में हमने Ubuntu वातावरण में cpp यूटिलिटी का उपयोग करके C प्रीप्रोसेसर के संचालन और मैक्रो पार्सिंग का गहन अवलोकन किया।
बिल्ड पाइपलाइन में आने वाली जटिल कोड त्रुटियों और हेडर समस्याओं के त्वरित समाधान में यह प्रीप्रोसेसिंग विश्लेषण तकनीक अत्यंत उपयोगी साबित होगी।