प्रीप्रोसेसर क्या है?
प्रीप्रोसेसर एक प्रोग्राम है जो सोर्स कोड को कंपाइलर के पास जाने से पहले प्रोसेस करता है। यह # प्रतीक से शुरू होने वाले प्रीप्रोसेसर निर्देशों के तहत काम करता है।
प्रीप्रोसेसर कमांड्स के तीन प्रकार
1. मैक्रो सब्स्टीट्यूशन डायरेक्टिव्स
हर घटना पर एक आइडेंटिफायर को पूर्वनिर्धारित स्ट्रिंग से बदल देता है।
सिंटैक्स
#define आइडेंटिफायर स्ट्रिंग
उदाहरण
#define PI 3.1415
#define SQUARE(x) (x * x)
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#undef PI // PI को अनडिफाइन करें
उदाहरण प्रोग्राम
#define WAIT getchar()
int main() {
printf("Hello");
WAIT; // getchar() में विस्तारित होता है
return 0;
}
आउटपुट
Hello
मैक्रो के प्रकार
| प्रकार | उदाहरण | विवरण |
|---|---|---|
| ऑब्जेक्ट-जैसा | #define MAX 100 | सरल स्थिरांक |
| फ़ंक्शन-जैसा | #define SQR(x) ((x)*(x)) | पैरामीटर लेता है |
| बहु-लाइन | #define MSG "Hello \\\n World" | बैकस्लैश जारी रखता है |
| वेरिएडिक | #define LOG(...) printf(__VA_ARGS__) | C99, चर आर्गुमेंट्स |
महत्वपूर्ण: पैरामीटर में पैरेंथेसिस
// खतरनाक
#define SQUARE(x) x * x
// SQUARE(3+2) → 3+2*3+2 = 11 ❌
// सुरक्षित
#define SQUARE(x) ((x) * (x))
// SQUARE(3+2) → (3+2)*(3+2) = 25 ✅
2. फ़ाइल इन्क्लूजन डायरेक्टिव्स
फ़ंक्शन्स या मैक्रो परिभाषाओं वाली बाहरी फ़ाइल को #include द्वारा शामिल किया जा सकता है।
सिंटैक्स
#include <filename> // सिस्टम हेडर (मानक खोज पथ)
#include "filename" // उपयोगकर्ता हेडर (वर्तमान निर्देशिका पहले)
उदाहरण
#include <stdio.h>
int main() {
printf("Hello\n");
return 0;
}
printf की परिभाषा <stdio.h> हेडर फ़ाइल में मौजूद है।
3. कंपाइलर कंट्रोल डायरेक्टिव्स (शर्ती संकलन)
C प्रीप्रोसेसर शर्ती संकलन की सुविधा प्रदान करता है, जिसका उपयोग प्रोग्राम में विशेष लाइन या लाइनों के समूह को ON/OFF करने के लिए किया जा सकता है।
निर्देश
| निर्देश | उद्देश्य |
|---|---|
#ifdef | यदि मैक्रो परिभाषित है |
#ifndef | यदि मैक्रो परिभाषित नहीं है |
#if | यदि स्थिर अभिव्यक्ति सत्य है |
#elif | अन्यथा यदि |
#else | अन्यथा |
#endif | शर्ती ब्लॉक समाप्त |
#error | कंपाइल त्रुटि उत्पन्न करें |
#pragma | कंपाइलर-विशिष्ट निर्देश |
उदाहरण प्रोग्राम
#define DEBUG 1
#include <stdio.h>
int main() {
#ifdef DEBUG
printf("डिबग मोड सक्रिय\n");
printf("यह लाइन केवल डिबग बिल्ड में कंपाइल होती है\n");
#else
printf("रिलीज मोड\n");
#endif
#if DEBUG_LEVEL > 2
printf("विस्तृत लॉगिंग\n");
#endif
return 0;
}
आउटपुट (DEBUG परिभाषित के साथ)
डिबग मोड सक्रिय
यह लाइन केवल डिबग बिल्ड में कंपाइल होती है
अन्य उपयोगी प्रीप्रोसेसर ऑपरेटर
स्ट्रिंगाइज़ ऑपरेटर (#)
#define TO_STRING(x) #x
printf("%s\n", TO_STRING(Hello World)); // "Hello World" प्रिंट करता है
टोकन पेस्टिंग ऑपरेटर (##)
#define CONCAT(a, b) a##b
int CONCAT(var, 1) = 10; // int var1 = 10; में विस्तारित
पूर्वनिर्धारित मैक्रो
| मैक्रो | विवरण |
|---|---|
__FILE__ | वर्तमान फ़ाइल नाम |
__LINE__ | वर्तमान लाइन नंबर |
__DATE__ | संकलन तिथि |
__TIME__ | संकलन समय |
__func__ | वर्तमान फ़ंक्शन नाम (C99) |
__STDC__ | C मानक अनुपालन |
उदाहरण: डिबग मैक्रो
#ifdef DEBUG
#define LOG(fmt, ...) printf("[DEBUG] %s:%d " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__)
#else
#define LOG(fmt, ...) // कुछ नहीं
#endif
int main() {
LOG("शुरू हो रहा है");
int x = 42;
LOG("x = %d", x);
LOG("समाप्त");
return 0;
}