Ubuntu पर cpp कमांड गाइड: C प्रीप्रोसेसर मैक्रो का उपयोग

परिचय

इस ट्यूटोरियल में हम Ubuntu सिस्टम पर C प्रीप्रोसेसर यानी cpp यूटिलिटी के आंतरिक संचालन और व्यवहार को व्यवहारिक उदाहरणों से समझेंगे। सोर्स कोड निर्माण के दौरान मैक्रो एक्सपेंशन, कंडीशनल कंपाइलेशन ट्रैकिंग और हेडर डायरेक्टरी रूटिंग जैसी आवश्यक प्रीप्रोसेसिंग तकनीकों का गहराई से विश्लेषण किया जाएगा।

प्रीप्रोसेसर इंस्टॉलेशन व बुनियादी संस्करण सत्यापन

प्रैक्टिकल लैब तैयार करने के लिए सबसे पहले सिस्टम रिपॉजिटरी अपडेट करें और बिल्ड टूल्स सुनिश्चित करने हेतु apt-get update -qq && apt-get install -y gcc रन करें।

GCC टूलचेन और प्रीप्रोसेसर पैकेज इंस्टॉलेशन

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

सिस्टम पाथ में cpp बाइनरी की जांच

स्थापित GNU प्रीप्रोसेसर के बिल्ड विवरण और सक्रिय वर्शन की पुष्टि के लिए cpp --version निष्पादित करें।
परिणाम से स्पष्ट होता है कि Ubuntu पर 13.3.0 वर्शन पूरी तरह कॉन्फ़िगर हो चुका है और उपयोग के लिए तैयार है।
⚙️ [महत्वपूर्ण कमांड-लाइन फ्लैग्स]

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

GNU cpp वर्शन और बिल्ड जानकारी

मैक्रो एक्सपेंशन और सोर्स कोड ट्रांसफॉर्मेशन

अभ्यास के लिए एक पृथक टेस्ट डायरेक्टरी तैयार करने और उसमें स्विच करने हेतु 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 फाइल बनाएं।

मैक्रो डेफिनिशन वाली C सोर्स फाइल तैयार करना

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

सोर्स फाइल को 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"; स्टेटमेंट का चयन करता है।

कमांड लाइन मैक्रो -D द्वारा डिबग ब्रांच सक्रियण

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

मैक्रो -U विकल्प द्वारा फॉलबैक कोड ब्रांच का चयन

कस्टम हेडर पाथ मैपिंग और क्लीन कोड जेनरेशन (-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 प्रीप्रोसेसर के संचालन और मैक्रो पार्सिंग का गहन अवलोकन किया।
बिल्ड पाइपलाइन में आने वाली जटिल कोड त्रुटियों और हेडर समस्याओं के त्वरित समाधान में यह प्रीप्रोसेसिंग विश्लेषण तकनीक अत्यंत उपयोगी साबित होगी।