আসুন আমরা বলি যে আমরা হেডার গার্ডগুলির মতো সুস্পষ্ট বিষয়গুলি এড়িয়ে যাব।
কখনও কখনও, আপনি এমন কোড তৈরি করতে চান যা প্রম্পম্পাইলার দ্বারা অনুলিপি / আটকানো দরকার:
#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__ প্রয়োজন। নিম্নলিখিত ভিজ্যুয়াল সি ++ এর জন্য একটি ক্লাসিক:
#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;
}
(দ্রষ্টব্য: কোড কপি / বুস্ট হোমপেজ থেকে আটকানো)
যা (আইএমএইচও) এর চেয়ে ভাল std::for_each
।
সুতরাং, ম্যাক্রোগুলি সর্বদা দরকারী কারণ তারা সাধারণ সংকলক নিয়মের বাইরে। তবে আমি দেখতে পেলাম যে বেশিরভাগ সময় আমি একটি দেখি, সেগুলি কার্যকরভাবে সি কোডের অবশেষে যথাযথ সি ++ তে কখনও অনুবাদ হয় না।