ম্যাক্রো হ'ল প্রাক-প্রসেসরটি আসল কোডে প্রেরণ করা পাঠ্যের টুকরো অনুলিপি / আটকানো হয়; ম্যাক্রোর লেখক আশা করেন যে প্রতিস্থাপনটি বৈধ কোড তৈরি করবে।
এতে সফল হওয়ার জন্য তিনটি ভাল "টিপস" রয়েছে:
ম্যাক্রোটিকে আসল কোডের মতো আচরণ করতে সহায়তা করুন
সাধারন কোডটি সাধারণত একটি আধা-কোলন দ্বারা শেষ হয়। ব্যবহারকারীর ভিউ কোডটির একটির প্রয়োজন নেই ...
doSomething(1) ;
DO_SOMETHING_ELSE(2) // <== Hey? What's this?
doSomethingElseAgain(3) ;
এর অর্থ ব্যবহারকারী আধা কোলন অনুপস্থিত থাকলে সংকলকটি একটি ত্রুটি তৈরির প্রত্যাশা করে।
তবে আসল আসল ভাল কারণটি হ'ল কোনও এক সময় ম্যাক্রোর লেখকের ম্যাক্রোর পরিবর্তে সম্ভবত একটি খাঁটি ফাংশন (সম্ভবত অন্তর্নিহিত) করা প্রয়োজন। সুতরাং ম্যাক্রোর সত্যিকারের মতো আচরণ করা উচিত ।
সুতরাং আমাদের একটি ম্যাক্রো থাকা উচিত সেমি-কোলন প্রয়োজন।
একটি বৈধ কোড উত্পাদন করুন
Jfm3 এর উত্তরে দেখানো হয়েছে, কখনও কখনও ম্যাক্রোতে একাধিক নির্দেশ থাকে। এবং যদি ম্যক্রোটি যদি একটি বিবৃতিতে ব্যবহার করা হয় তবে এটি সমস্যাযুক্ত হবে:
if(bIsOk)
MY_MACRO(42) ;
এই ম্যাক্রো হিসাবে প্রসারিত হতে পারে:
#define MY_MACRO(x) f(x) ; g(x)
if(bIsOk)
f(42) ; g(42) ; // was MY_MACRO(42) ;
g
ফাংশনের মান নির্বিশেষে মৃত্যুদন্ড কার্যকর করা হবে bIsOk
।
এর অর্থ হল যে আমাদের অবশ্যই ম্যাক্রোতে একটি সুযোগ যুক্ত করতে হবে:
#define MY_MACRO(x) { f(x) ; g(x) ; }
if(bIsOk)
{ f(42) ; g(42) ; } ; // was MY_MACRO(42) ;
একটি বৈধ কোড 2 উত্পাদন করুন
ম্যাক্রো কিছু হলে:
#define MY_MACRO(x) int i = x + 1 ; f(i) ;
নিম্নলিখিত কোডটিতে আমাদের আর একটি সমস্যা হতে পারে:
void doSomething()
{
int i = 25 ;
MY_MACRO(32) ;
}
কারণ এটি এর প্রসারিত হবে:
void doSomething()
{
int i = 25 ;
int i = 32 + 1 ; f(i) ; ; // was MY_MACRO(32) ;
}
এই কোডটি অবশ্যই সংকলন করবে না। সুতরাং, আবারও, সমাধানটি একটি সুযোগ ব্যবহার করছে:
#define MY_MACRO(x) { int i = x + 1 ; f(i) ; }
void doSomething()
{
int i = 25 ;
{ int i = 32 + 1 ; f(i) ; } ; // was MY_MACRO(32) ;
}
কোডটি আবার সঠিকভাবে আচরণ করে।
আধা-কোলন + স্কোপ ইফেক্টের সংমিশ্রণ?
এখানে একটি সি / সি ++ বুদ্ধিমান রয়েছে যা এই প্রভাবটি তৈরি করে: কর / যখন লুপ:
do
{
// code
}
while(false) ;
কর / যখন একটি সুযোগ তৈরি করতে পারে, এইভাবে ম্যাক্রোর কোডটি encapsulate করে, এবং শেষ পর্যন্ত একটি অর্ধ-কোলন প্রয়োজন, সুতরাং কোডটির প্রয়োজনীয় কোডে প্রসারিত হয়।
বোনাস?
সি ++ সংকলকটি ডু / যখন লুপটি অপ্টিমাইজ করবে, কারণ এর পোস্ট-শর্তটি মিথ্যা হ'ল সংকলন সময়ে জানা যায়। এর অর্থ হ'ল ম্যাক্রোর মতো:
#define MY_MACRO(x) \
do \
{ \
const int i = x + 1 ; \
f(i) ; g(i) ; \
} \
while(false)
void doSomething(bool bIsOk)
{
int i = 25 ;
if(bIsOk)
MY_MACRO(42) ;
// Etc.
}
হিসাবে সঠিকভাবে প্রসারিত হবে
void doSomething(bool bIsOk)
{
int i = 25 ;
if(bIsOk)
do
{
const int i = 42 + 1 ; // was MY_MACRO(42) ;
f(i) ; g(i) ;
}
while(false) ;
// Etc.
}
এবং তারপরে সংকলন এবং অপ্টিমাইজ করা হয়
void doSomething(bool bIsOk)
{
int i = 25 ;
if(bIsOk)
{
f(43) ; g(43) ;
}
// Etc.
}
void
প্রকারের শেষে টাইপের একটি এক্সপ্রেশন যুক্ত করব ... ((শূন্য) 0) এর মতো ।