C99 এ ভেরিয়েডিক ম্যাক্রোগুলির জন্য খালি আরগগুলির সাথে একটি সুপরিচিত সমস্যা রয়েছে।
উদাহরণ:
#define FOO(...) printf(__VA_ARGS__)
#define BAR(fmt, ...) printf(fmt, __VA_ARGS__)
FOO("this works fine");
BAR("this breaks!");
BAR()
উপরের ব্যবহারটি সত্যই C99 স্ট্যান্ডার্ড অনুযায়ী ভুল, যেহেতু এটি প্রসারিত হবে:
printf("this breaks!",);
পেছনের কমাটি নোট করুন - কার্যক্ষম নয় work
কিছু সংকলক (উদাহরণস্বরূপ: ভিজ্যুয়াল স্টুডিও 2010) আপনার জন্য চুপচাপ সেই পেছনের কমাটি থেকে মুক্তি পাবে। অন্যান্য সংকলক (যেমন: জিসিসি) ##
এর সামনে রাখার পক্ষে সমর্থন করে __VA_ARGS__
:
#define BAR(fmt, ...) printf(fmt, ##__VA_ARGS__)
তবে এই আচরণটি পাওয়ার জন্য কি কোনও মান-মেনে চলার উপায় আছে? সম্ভবত একাধিক ম্যাক্রো ব্যবহার করছেন?
এখনই, ##
সংস্করণটি মোটামুটি সু-সমর্থিত বলে মনে হচ্ছে (কমপক্ষে আমার প্ল্যাটফর্মগুলিতে) তবে আমি সত্যিই বরং মান-সম্মতিযুক্ত সমাধানটি ব্যবহার করব।
প্রাক-উদ্দীপক: আমি জানি আমি কেবল একটি ছোট ফাংশন লিখতে পারি। আমি ম্যাক্রো ব্যবহার করে এটি করার চেষ্টা করছি।
সম্পাদনা করুন : কেন আমি বার () ব্যবহার করতে চাই তার একটি উদাহরণ এখানে (সহজ হলেও) রয়েছে:
#define BAR(fmt, ...) printf(fmt "\n", ##__VA_ARGS__)
BAR("here is a log message");
BAR("here is a log message with a param: %d", 42);
এটি স্বয়ংক্রিয়ভাবে আমার বার () লগিং স্টেটমেন্টগুলিতে একটি নতুন লাইন যুক্ত করে, ধরে নিই fmt
যে সবসময় একটি ডাবল-কোটেড সি-স্ট্রিং থাকে। এটি পৃথক প্রিন্টফ () হিসাবে নতুন লাইনটি মুদ্রণ করে না, যা লগিং লাইন-বাফার করে এবং একাধিক উত্স থেকে অবিচ্ছিন্নভাবে আসে তা সুবিধাজনক।
__VA_OPT__
। এই ইতিমধ্যে হয়েছে "গৃহীত" করেছে C দ্বারা ++ তাই আমি আশা সি মামলা অনুসরণ করা হবে। (জানেন না যে এর অর্থ এটি দ্রুত সি ++ 17 তে ট্র্যাক হয়েছিল কিনা বা এটি যদিও সি ++ 20 এর জন্য সেট করা হয়েছে)
BAR
পরিবর্তে কেন ব্যবহার করবেনFOO
?