प्रीप्रोसेसर मैक्रो का उपयोग करके फंक्शन के अंदर printf को रीडिफाइन किया जा सकता है। यह एक **खतरनाक और गैर-मानक** तकनीक है, केवल शैक्षणिक उद्देश्य के लिए।
उदाहरण
#include <stdio.h>
void changePrintf() {
// इस स्कोप में printf को रीडिफाइन करता है
#define printf(x, y) printf(x, 50)
}
int main() {
int x = 40;
changePrintf(); // मैक्रो सक्रिय होता है
printf("%d\n", x); // 50 प्रिंट करता है (x की जगह 50)
x = 60;
printf("%d", x); // 50 प्रिंट करता है
return 0;
}
आउटपुट
50 50
कैसे काम करता है
#define printf(x, y) printf(x, 50)मैक्रोchangePrintfके स्कोप मेंprintfको रीडिफाइन करता है।- दूसरा आर्गुमेंट
yनजरअंदाज होकर 50 से बदल जाता है। - यह केवल उसी स्कोप/फाइल में प्रभावी होता है जहां मैक्रो परिभाषित है।
क्यों यह खराब अभ्यास है
- प्रीप्रोसेसर मैक्रो लेक्सिकल स्कोप का पालन नहीं करते (फंक्शन स्कोप नहीं)।
- कोड पठनीयता और रखरखाव को गंभीर रूप से नुकसान पहुंचाता है।
- डिबगिंग अत्यंत कठिन हो जाती है।
- स्टैंडर्ड लाइब्रेरी फंक्शन्स को रीडिफाइन करना अनडिफाइंड बिहेवियर हो सकता है।
सही विकल्प
- कस्टम प्रिंटिंग के लिए अपना फंक्शन लिखें:
void my_printf(const char *fmt, ...)। - लॉगिंग लेवल्स के लिए कंडीशनल कंपाइलेशन उपयोग करें।
- C++ में
std::coutरीडायरेक्शन (rdbuf()) उपयोग करें।