## এবং __LINE__ দিয়ে সি ম্যাক্রো তৈরি করা হচ্ছে (অবস্থান ম্যাক্রোর সাথে টোকেন কনটেন্টেশন)


107

আমি একটি সি ম্যাক্রো তৈরি করতে চাই যা লাইন নম্বরটির উপর ভিত্তি করে একটি নাম দিয়ে একটি ফাংশন তৈরি করে। আমি ভেবেছিলাম আমি এর মতো কিছু করতে পারি (আসল ফাংশনটির ধনুর্বন্ধনীগুলির মধ্যে বিবৃতি থাকবে):

#define UNIQUE static void Unique_##__LINE__(void) {}

যা আমি প্রত্যাশা করেছিলাম এমন কিছুতে প্রসারিত হবে:

static void Unique_23(void) {}

যে কাজ করে না। টোকেন কনকেনটেশন সহ, অবস্থান ম্যাক্রোগুলিকে আক্ষরিক অর্থে চিকিত্সা করা হয়, এতে প্রসারিত হয়ে শেষ হয়:

static void Unique___LINE__(void) {}

এটা কি সম্ভব?

(হ্যাঁ, এটি যতটা নিরর্থক বলে মনে হোক না কেন আমি এটি করার একটি বাস্তব কারণ আছে)।


আমি মনে করি আপনি এটি অপ্রত্যক্ষ ম্যাক্রো সম্প্রসারণের সাথে কাজ করতে পারেন ।
বেন স্টিগ্লিটজ

উত্তর:


176

সমস্যাটি হ'ল যখন আপনার ম্যাক্রো রিপ্লেসমেন্ট থাকে, প্রিপ্রসেসর কেবল তখনই ম্যাক্রোগুলিকে প্রসারিত করে যদি স্ট্রিংাইজিং অপারেটর #বা টোকেন- পেস্টিং অপারেটরের ##সাথে এটি প্রয়োগ করা হয় না। সুতরাং, আপনাকে নির্দেশের কিছু অতিরিক্ত স্তর ব্যবহার করতে হবে, আপনি টোকন-পেস্টিং অপারেটরটি পুনরাবৃত্তভাবে প্রসারিত যুক্তি দিয়ে ব্যবহার করতে পারেন:

#define TOKENPASTE(x, y) x ## y
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
#define UNIQUE static void TOKENPASTE2(Unique_, __LINE__)(void) {}

তারপরে, __LINE__সম্প্রসারণের সময় লাইন সংখ্যায় প্রসারিত হয় UNIQUE(যেহেতু এটি উভয়র সাথে #বা এর সাথে জড়িত নয় ##) এবং তারপরে প্রসারণের সময় টোকন পেস্টিং ঘটে TOKENPASTE

এটিও লক্ষ করা উচিত যে __COUNTER__ম্যাক্রোটিও রয়েছে, যা প্রতিটি সময় মূল্যায়িত হওয়ার সাথে সাথে একটি নতুন পূর্ণসংখ্যার দিকে প্রসারিত হয়, যদি UNIQUEএকই লাইনে আপনার ম্যাক্রোর একাধিক ইনস্ট্যান্টেশন প্রয়োজন হয় । দ্রষ্টব্য: __COUNTER__এমএস ভিজ্যুয়াল স্টুডিও, জিসিসি (ভি 4.3 থেকে) এবং ক্ল্যাং দ্বারা সমর্থিত, তবে এটি স্ট্যান্ডার্ড সি নয় is


3
আমি ভীত যে জিএনইউ সিপিপি-র সাথে কাজ করে না। টোকেনপাস্ট আক্ষরিক হিসাবে লাইন ব্যবহার করে । টোকেনপাস্ট (ইউনিক_, লাইন ) ইউনিক___LINE__
ডিডি

3
@ ডিডি: ডিওহ, এখনই ঠিক করা হয়েছে। এটির জন্য 2 স্তর স্তর প্রয়োজন, 1 টি নয়
অ্যাডাম রোজেনফিল্ড

__COUNTER__ম্যাক্রো জিসিসি আমার জন্য কাজ না করে; যদিও __LINE__এক বিজ্ঞাপন হিসাবে কাজ করেছে।
টাইলার

2
যে কেউ চেষ্টা করার জন্য অতিরিক্ত তথ্য বিট COUNTER টি অনুযায়ী msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx এটি Microsoft করার জন্য একটি ম্যাক্রো সুনির্দিষ্ট।
এলভা

3
আপনার কেন 2 স্তরের ইন্ডিরিয়ারেশন দরকার তার কোনও ব্যাখ্যা? আমি # এবং ## অনুপস্থিত, মাত্র একটি দিয়ে এটি ব্যবহার করে দেখেছি এবং এটি ভিএস2017 এ প্রসারিত করে না। স্পষ্টতই এটি জিসিসির ক্ষেত্রে সত্য। তবে আপনি যদি দ্বিতীয় স্তরের ইন্ডিরিয়ারেশন যুক্ত করেন তবে তা প্রসারিত হয়। ম্যাজিক?
গাবে হালসমার

-2

ফলাফলকে "স্ট্রিংফাইড" করার দরকার না হলে জিসিসির জন্য "মোড়ানো" (বা উপলব্ধি করা) প্রয়োজন হয় না। সিসির বৈশিষ্ট্যগুলি রয়েছে তবে সবগুলি সরল সি সংস্করণ 1 দিয়ে করা যেতে পারে (এবং কিছু যুক্তি বার্কলে ৪.৩ সি এর ব্যবহারে কীভাবে শিখতে হবে তা এত দ্রুত)।

** ঝনঝন (এলএলভিএম) ম্যাক্রো সম্প্রসারণের জন্য সাদা স্পেস সঠিকভাবে করেন না - এটি শ্বেত স্পেস যুক্ত করে (এটি অবশ্যই প্রাক প্রাক প্রক্রিয়াজাতকরণের জন্য সি আইডেন্টিফায়ার হিসাবে ফলাফলটি ধ্বংস করে) **, ঝনঝনানি কেবল # বা * ম্যাক্রো সম্প্রসারণ করে না সি প্রিপ্রসেসর হিসাবে কয়েক দশক ধরে প্রত্যাশিত। প্রধান উদাহরণটি এক্স 11 সংকলন করছে, ম্যাক্রো "কনক্যাট 3" নষ্ট হয়েছে, এর ফলাফলটি এখন এমআইএসআইএমডি সি আইডেন্টিফায়ার, যা অবশ্যই তৈরি করতে ব্যর্থ হয়। এবং আমি বিল্ড ব্যর্থ জিনিস তাদের পেশা হয় শুরু করছি।

আমি মনে করি এখানে উত্তরটি "নতুন সি যা মান ভেঙে খারাপ সি", এই হ্যাকগুলি সর্বদা পছন্দ করে (ক্লোবার নেমস্পেস) তারা কোনও কারণ ছাড়াই খেলাপি পরিবর্তন করে তবে সত্যিকার অর্থে "সি" উন্নত করে না (তাদের নিজস্ব কথাটি বাদে তাই বলে: যা আমি বলুন, কেন সমস্ত বিভাজন তারা এখনও তাদের জন্য দায়ী করেনি কেন তারা পালিয়ে যায় তা বোঝাতে বৈপরীত্য তৈরি করা হয়)।


এটি কোনও সমস্যা নয় যে পূর্ববর্তী সি প্রসেসরগুলি ইউএনআইকি_ () __ সমর্থন করে না __ কারণ তারা # প্রগমা সমর্থন করেছিল যা "কোডের মধ্যে সংকলক ব্র্যান্ড হ্যাকারিকে হ্যাকারি হিসাবে চিহ্নিত করতে সক্ষম করে" এবং কার্যকর মানগুলির সাথে ঠিক পাশাপাশি কাজ করে: ঠিক তেমন পরিবর্তন ডিফল্টগুলি অকেজো ওয়াটনের ভাঙ্গন এবং একই নাম (নেমস্পেস ক্লোবার্বিং) ব্যবহার করার সময় কোনও ফাংশন কী করে তা পরিবর্তন করা ... আমার মতে ম্যালওয়ার

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.