मान लीजिए कि हम हेडर गार्ड जैसी स्पष्ट चीजों को अनदेखा करेंगे।
कभी-कभी, आप उस कोड को उत्पन्न करना चाहते हैं जिसे precompiler द्वारा कॉपी / पेस्ट किया जाना है:
#define RAISE_ERROR_STL(p_strMessage) \
do \
{ \
try \
{ \
std::tstringstream strBuffer ; \
strBuffer << p_strMessage ; \
strMessage = strBuffer.str() ; \
raiseSomeAlert(__FILE__, __FUNCSIG__, __LINE__, strBuffer.str().c_str()) \
} \
catch(...){} \
{ \
} \
} \
while(false)
जो आपको यह कोड करने में सक्षम बनाता है:
RAISE_ERROR_STL("Hello... The following values " << i << " and " << j << " are wrong") ;
और संदेश उत्पन्न कर सकते हैं जैसे:
Error Raised:
====================================
File : MyFile.cpp, line 225
Function : MyFunction(int, double)
Message : "Hello... The following values 23 and 12 are wrong"
ध्यान दें कि मैक्रोज़ के साथ टेम्प्लेट मिलाने से और भी बेहतर परिणाम मिल सकते हैं (यानी अपने वैरिएबल नामों के साथ-साथ वैल्यू को साथ-साथ पैदा करना)
उदाहरण के लिए, डिबग जानकारी उत्पन्न करने के लिए, दूसरी बार, आपको कुछ कोड के __FILE__ और / या __LINE__ की आवश्यकता होती है। निम्नलिखित दृश्य C ++ के लिए एक क्लासिक है:
#define WRNG_PRIVATE_STR2(z) #z
#define WRNG_PRIVATE_STR1(x) WRNG_PRIVATE_STR2(x)
#define WRNG __FILE__ "("WRNG_PRIVATE_STR1(__LINE__)") : ------------ : "
निम्नलिखित कोड के साथ के रूप में:
#pragma message(WRNG "Hello World")
यह संदेश उत्पन्न करता है जैसे:
C:\my_project\my_cpp_file.cpp (225) : ------------ Hello World
दूसरी बार, आपको # और ## कॉन्फैक्शन ऑपरेटर्स का उपयोग करके कोड जेनरेट करने की आवश्यकता होती है, जैसे प्रॉपर्टी के लिए गेटर्स और सेटर्स जेनरेट करना (यह काफी सीमित मामलों के लिए होता है)।
अन्य बार, यदि आप एक फ़ंक्शन के माध्यम से उपयोग किया जाता है, तो आप संकलन नहीं करेंगे, जैसे:
#define MY_TRY try{
#define MY_CATCH } catch(...) {
#define MY_END_TRY }
जिसका उपयोग किया जा सकता है
MY_TRY
doSomethingDangerous() ;
MY_CATCH
tryToRecoverEvenWithoutMeaningfullInfo() ;
damnThoseMacros() ;
MY_END_TRY
(अब भी, मैं सिर्फ सही इस्तेमाल किया कोड के इस प्रकार देखा एक बार )
अंतिम, लेकिन कम से कम, प्रसिद्ध नहीं boost::foreach!!!
#include <string>
#include <iostream>
#include <boost/foreach.hpp>
int main()
{
std::string hello( "Hello, world!" );
BOOST_FOREACH( char ch, hello )
{
std::cout << ch;
}
return 0;
}
(नोट: कोड कॉपी / बूस्ट होमपेज से चिपकाया गया)
जो (IMHO) से बेहतर तरीका है std::for_each।
इसलिए, मैक्रोज़ हमेशा उपयोगी होते हैं क्योंकि वे सामान्य संकलक नियमों के बाहर होते हैं। लेकिन मुझे लगता है कि ज्यादातर समय मैं एक को देखता हूं, वे प्रभावी रूप से सी कोड के बने रहते हैं जिसका कभी भी उचित सी ++ में अनुवाद नहीं किया जाता है।