## প্রিপ্রোসেসর অপারেটর এবং বিবেচনা করার জন্য গোটচসের অ্যাপ্লিকেশনগুলি কী কী?


88

আমার আগের অনেক প্রশ্নে উল্লিখিত হিসাবে, আমি কেএন্ডআর এর মাধ্যমে কাজ করছি এবং বর্তমানে প্রিপ্রোসেসর হিসাবে আছি। আরও মজাদার বিষয়গুলির মধ্যে একটি - যা আমি সি শিখার আমার পূর্বের যে কোনও প্রচেষ্টা থেকে আগে কখনও জানতাম না - এটি ##প্রিপ্রোসেসর অপারেটর। কে অ্যান্ড আর অনুসারে:

প্রিপ্রোসেসর অপারেটর ## ম্যাক্রো প্রসারণের সময় প্রকৃত যুক্তিগুলি সংযুক্ত করার একটি উপায় সরবরাহ করে। প্রতিস্থাপন পাঠ্যের কোনও পরামিতি যদি একটি সংলগ্ন হয় ##তবে প্যারামিটারটি আসল যুক্তি দ্বারা প্রতিস্থাপন করা হয় ##এবং আশেপাশের সাদা স্থান সরিয়ে ফেলা হয় এবং ফলাফলটি আবার স্ক্যান করা হয়। উদাহরণস্বরূপ, ম্যাক্রো paste তার দুটি আর্গুমেন্টকে সম্মতি জানায় :

#define paste(front, back) front ## back

সুতরাং paste(name, 1)টোকেন তৈরি করে name1

কেউ কেন এবং কেন বাস্তব বিশ্বে এটি ব্যবহার করবে? এর ব্যবহারিক ব্যবহারিক উদাহরণগুলি কী কী, এবং সেখানে কি বিবেচনা করার মতো কিছু আছে?

উত্তর:


47

ক্র্যাশআরপিট: ম্যাক্রো মাল্টি-বাইট স্ট্রিংগুলি ইউনিকোডে রূপান্তর করতে ## ব্যবহার করে

CrashRpt (ক্র্যাশ রিপোর্টিং লাইব্রেরি) এর একটি আকর্ষণীয় ব্যবহার নিম্নলিখিত:

এখানে তারা প্রতি-বাইট-প্রতি-চর স্ট্রিংয়ের পরিবর্তে একটি দ্বি-বাইট স্ট্রিং ব্যবহার করতে চায়। এটি সম্ভবত দেখে মনে হচ্ছে এটি সত্যই অর্থহীন, তবে তারা এটি একটি ভাল কারণে করে।

তারা এটি অন্য ম্যাক্রোর সাথে ব্যবহার করে যা তারিখ এবং সময় দিয়ে স্ট্রিং দেয়।

ফেলে Lএকটি পাশে __ DATE __আপনি একটি কম্পাইলেশন সংক্রান্ত ত্রুটিগুলি দিতে হবে।


উইন্ডোজ: জেনেরিক ইউনিকোড বা মাল্টি-বাইট স্ট্রিংয়ের জন্য ## ব্যবহার করা

উইন্ডোজ নিম্নলিখিত মত কিছু ব্যবহার করে:

এবং _Tকোড সর্বত্র ব্যবহৃত হয়


পরিষ্কার অ্যাক্সেসর এবং সংশোধক নামগুলির জন্য ব্যবহার করে বিভিন্ন গ্রন্থাগার:

আমি এটি ব্যবহারকারীর এবং সংশোধক সংজ্ঞায়িত করতে কোডেও দেখেছি:

একইভাবে আপনি অন্য কোনও ধরণের চালাক নাম তৈরির জন্য এই একই পদ্ধতিটি ব্যবহার করতে পারেন।


বিভিন্ন গ্রন্থাগার, এটি একবারে বিভিন্ন পরিবর্তনশীল ঘোষণা করতে ব্যবহার করে:


4
যেহেতু আপনি সংকলনের সময়ে স্ট্রিং আক্ষরিক সংমিশ্রণ করতে পারেন, আপনি বিল্ডডেট অভিব্যক্তিটি হ্রাস করতে std::wstring BuildDate = WIDEN(__DATE__) L" " WIDEN(__TIME__); এবং স্পষ্টভাবে একবারে পুরো স্ট্রিংটি তৈরি করতে পারেন।
ব্যবহারকারী 666412

49

আপনি যখন টোকেন-পেস্ট (' ##') বা স্ট্রিংাইজিং (' #') প্রিপ্রসেসিং অপারেটরগুলি ব্যবহার করছেন তখন সচেতন থাকার একটি বিষয় হ'ল সব ক্ষেত্রে সঠিকভাবে কাজ করার জন্য আপনাকে অতিরিক্ত স্তরের ইন্ডিয়ারেশন ব্যবহার করতে হবে।

আপনি যদি এটি না করেন এবং টোকেন-পেস্টিং অপারেটরের কাছে দেওয়া আইটেমগুলি ম্যাক্রো হয় তবে আপনি ফলাফল পাবেন যা সম্ভবত আপনি চান না:

আউটপুট:


4
এই প্রিপ্রোসেসর আচরণের ব্যাখ্যার জন্য দেখুন স্ট্যাকওভারফ্লো
অ্যাডাম ডেভিস

@ মিশেলবার আমি আপনার উত্তরটি পড়ছিলাম এবং আমার সন্দেহ আছে। এই লাইনটি কীভাবে লাইন নম্বরটি মুদ্রণ করছে?
পিএলজেড

4
@ অভিমন্যু আর্যান: আমি নিশ্চিত নই যে আপনি যা জিজ্ঞাসা করছেন এটি এটি কিনা, তবে __LINE__একটি বিশেষ ম্যাক্রো নাম যা উত্স ফাইলটির বর্তমান লাইন নম্বরটির সাথে প্রিপ্রোসেসর দ্বারা প্রতিস্থাপিত হয়েছিল।
মাইকেল বুড়

ভাষা স্পেসিফিকেশন এখানে
আন্তোনিও

14

সংকলকের নতুন সংস্করণে আপগ্রেড করার সময় আমি এখানে গেছি:

টোকন-পেস্টিং অপারেটরের অপ্রয়োজনীয় ব্যবহার ##অ-বহনযোগ্য এবং এটি অনাকাঙ্ক্ষিত সাদা স্থান, সতর্কতা বা ত্রুটিগুলি তৈরি করতে পারে।

টোকন-পেস্টিং অপারেটরের ফলাফল যখন বৈধ প্রিপ্রোসেসর টোকেন নয়, টোকেন-পেস্টিং অপারেটর অপ্রয়োজনীয় এবং সম্ভবত ক্ষতিকারক।

উদাহরণস্বরূপ, কেউ টোকেন-পেস্টিং অপারেটরটি ব্যবহার করে সংকলন সময়ে স্ট্রিং লিটারালগুলি তৈরির চেষ্টা করতে পারে:

কিছু সংকলক, এটি প্রত্যাশিত ফলাফল আউটপুট হবে:

অন্যান্য সংকলকগুলিতে, এতে অনাকাঙ্ক্ষিত সাদা স্থান অন্তর্ভুক্ত থাকবে:

GCC এর মোটামুটি আধুনিক সংস্করণ (> = 3.3 বা তার বেশি) এই কোডটি সংকলন করতে ব্যর্থ হবে:

সমাধানটি হ'ল সি / সি ++ অপারেটরগুলিতে প্রিপ্রসেসর টোকেনগুলি সংযুক্ত করার সময় টোকন-পেস্টিং অপারেটরটিকে বাদ দেওয়া:

সংযুক্তকরণের উপর জিসিসি সিপিপি ডকুমেন্টেশন অধ্যায় টোকেন-পেস্ট অপারেটর উপর আরো উপযোগী তথ্য রয়েছে।


ধন্যবাদ - আমি এটি সম্পর্কে অবগত ছিলাম না (তবে তখন আমি এই প্রিপ্রসেসিং অপারেটরগুলিকে খুব বেশি ব্যবহার করি না ...)।
মাইকেল বারার 1

4
একে কারণ হিসাবে "টোকেন পেষ্টিং" অপারেটর বলা হয় - আপনি যখন কাজ শেষ করেন তখন একক টোকেন দিয়ে শেষ করা উচিত। ভাল লেখার।
মার্ক র্যানসম

টোকেন-পেস্টিং অপারেটরের ফলাফল যখন বৈধ প্রিপ্রোসেসর টোকেন না হয়, তখন আচরণটি অপরিজ্ঞাত হয়।
আলেকোভ

হেক্সাডেসিমাল ভাসমান, বা (সি ++ তে) ডিজিটাল বিভাজক এবং ব্যবহারকারী-সংজ্ঞায়িত আক্ষরিকের মতো ভাষার পরিবর্তনগুলি ক্রমাগত পরিবর্তন করে যা একটি "বৈধ প্রিপ্রোসেসিং টোকেন" গঠন করে, তাই দয়া করে এটিকে কখনও অপব্যবহার করবেন না! আপনার যদি টোকেনগুলি আলাদা করতে (ভাষা যথাযথ) করতে হয় তবে দয়া করে এটিকে দুটি পৃথক টোকেন হিসাবে বানান করুন এবং প্রিপ্রসেসর ব্যাকরণ এবং ভাষার যথাযথ ভাষার মধ্যে দুর্ঘটনাজনিত মিথস্ক্রিয়ার উপর নির্ভর করবেন না।
কেরেক এসবি

6

অযথা নিজেকে পুনরাবৃত্তি না করার জন্য এটি সমস্ত ধরণের পরিস্থিতিতে কার্যকর। নিম্নলিখিতটি ইমাক্স উত্স কোড থেকে একটি উদাহরণ। আমরা একটি লাইব্রেরি থেকে বেশ কয়েকটি ফাংশন লোড করতে চাই। "Foo" ফাংশনটি নির্ধারিত করা উচিত fn_foo, ইত্যাদি। আমরা নিম্নলিখিত ম্যাক্রো সংজ্ঞায়িত:

তারপরে আমরা এটি ব্যবহার করতে পারি:

সুবিধাটি উভয়ই লিখতে হবে না fn_XpmFreeAttributesএবং "XpmFreeAttributes"(এবং এর মধ্যে একটিরও ভুল বানান ঝুঁকিপূর্ণ)।


4

স্ট্যাক ওভারফ্লোতে পূর্ববর্তী একটি প্রশ্নে ত্রুটি-প্রবণ পুনরায় টাইপিং ছাড়াই গণনার ধ্রুবকগুলির জন্য স্ট্রিং উপস্থাপনা উত্পন্ন করার একটি সহজ পদ্ধতি জিজ্ঞাসা করা হয়েছিল।

লিঙ্ক

এই প্রশ্নের আমার জবাবটি দেখিয়েছে যে কীভাবে সামান্য প্রিপ্রোসেসর যাদু প্রয়োগ করা আপনাকে আপনার গণনার সংজ্ঞা দিতে দেয় (উদাহরণস্বরূপ) ...;

... এই সুবিধার সাথে যে ম্যাক্রো এক্সপেনশন কেবল গণনা (একটি .h ফাইলে) সংজ্ঞায়িত করে না, এটি স্ট্রিংগুলির একটি ম্যাচিং অ্যারের সংজ্ঞা দেয় (একটি .c ফাইলে);

স্ট্রিং টেবিলের নামটি ম্যাক্রো প্যারামিটার (অর্থাত্ রঙ) পেস্টিং থেকে স্ট্রিংটবেলে আসে ## অপারেটর ব্যবহার করে। # এবং ## অপারেটর অমূল্য যেখানে এটির মতো অ্যাপ্লিকেশন (কৌশল?) Are


3

যখন আপনাকে অন্য কোনও কিছুর সাথে ম্যাক্রো পরামিতিগুলি সংযুক্ত করতে হবে তখন আপনি টোকেন পেস্টিং ব্যবহার করতে পারেন।

এটি টেমপ্লেটগুলির জন্য ব্যবহার করা যেতে পারে:

এই ক্ষেত্রে লিঙ্কটি আপনাকে দিতে হবে int

একইভাবে আপনি তালিকা ট্র্যাভারসাল জন্য একটি ফাংশন টেম্পলেট লিখতে পারেন।


2

আমি সি প্রোগ্রামগুলিতে এটি ব্যবহার করে এমন পদ্ধতিগুলির সেটগুলির প্রোটোটাইপগুলি সঠিকভাবে প্রয়োগ করতে সহায়তা করে যা অবশ্যই কোনও ধরণের কলিং কনভেনশন মেনে চলে। একরকমভাবে, এটি স্ট্রেট সি-তে দরিদ্র লোকের বস্তুগত অবস্থানের জন্য ব্যবহার করা যেতে পারে:

এরকম কিছুতে প্রসারিত:

এটি যখন আপনি করেন তখন সমস্ত "উত্পন্ন" অবজেক্টের জন্য সঠিক পরামিতি প্রয়োগ করে:

আপনার শিরোনাম ফাইলগুলিতে উপরের ইত্যাদি etc. এটি রক্ষণাবেক্ষণের জন্যও কার্যকর যখন আপনি এমনকি সংজ্ঞাগুলি পরিবর্তন করতে চান এবং / অথবা "অবজেক্টস" -এ পদ্ধতি যুক্ত করতে চান।


2

এস.গ্লিব মূলত সি তে টেমপ্লেটগুলি ফাজ করতে ## ব্যবহার করে কারণ কোনও ক্রিয়াকলাপ ওভারলোডিং নেই, তাই ## উত্পাদিত ক্রিয়াকলাপগুলির নামগুলিতে প্রকারের নামটি আঠালো করতে ব্যবহৃত হয়। আমার যদি তালিকা_t নামে একটি তালিকার ধরণ থাকে তবে আমি স্যাজলিব_লিস্ট_টি_কনক্যাট এর মতো ফাংশন পেয়ে যাব।


2

আমি এটি এম্বেডের জন্য একটি অ-মানক সি সংকলকটিতে কোনও ঘরের ঘূর্ণায়মান দৃsert়তার জন্য ব্যবহার করি:


4
আমি এটি 'অ-মানক' দ্বারা বোঝাতে চাইছি যে সংকলকটি স্ট্রিং পেষ্টিং করেনি তবে টোকেন পেস্টিং করেছে - বা এটি ছাড়াও ##কী কাজ করবে ?
পিজেট্রাইল

1

আমি ম্যাক্রো দ্বারা সংজ্ঞায়িত ভেরিয়েবলগুলিতে কাস্টম উপসর্গ যুক্ত করার জন্য এটি ব্যবহার করি। সুতরাং যেমন কিছু:

এতে প্রসারিত:


1

এর প্রধান ব্যবহার হ'ল যখন আপনার নামকরণের সম্মেলন হয় এবং আপনি চান যে আপনার ম্যাক্রো সেই নামকরণের কনভেনশনটির সদ্ব্যবহার করুন। সম্ভবত আপনার বেশ কয়েকটি পদ্ধতির পরিবার রয়েছে: চিত্র_ক্রিয়েট (), চিত্র_অ্যাক্টিভেট (), এবং চিত্র_রেইজ () এছাড়াও ফাইল_ক্রিয়াট (), ফাইল_একটিভেট (), ফাইল_রিলিজ (), এবং মোবাইল_ক্রিয়েট (), মোবাইল_অ্যাক্টিভেট () এবং মোবাইল_প্রিজ ()।

আপনি অবজেক্ট লাইফসাইकल পরিচালনা করার জন্য ম্যাক্রো লিখতে পারেন:

অবশ্যই নামকরণের একমাত্র ধরণের নাম "অবজেক্টের ন্যূনতম সংস্করণ" নয় যা এই ক্ষেত্রে প্রযোজ্য - প্রায় বেশিরভাগ নামকরণ কনভেনশনই নামগুলি গঠনের জন্য একটি সাধারণ উপ-স্ট্রিং ব্যবহার করে। এটি আমার নাম (উপরে হিসাবে), বা ক্ষেত্রের নাম, ভেরিয়েবলের নাম বা অন্য যে কোনও কিছুতে কাজ করতে পারে।


1

উইনসইএর একটি গুরুত্বপূর্ণ ব্যবহার:

রেজিস্টার বিটের বিবরণ নির্ধারণ করার সময় আমরা নিম্নলিখিতটি করি:

এবং বিআইটিএফএমএসকে ব্যবহার করার সময়, কেবল ব্যবহার করুন:


0

এটি লগিং জন্য খুব দরকারী। আপনি করতে পারেন:

বা, যদি আপনার সংকলক ফাংশন এবং ফানক সমর্থন করে না :

উপরের "ফাংশনগুলি" বার্তা লগ করে এবং ঠিক কোন ফাংশনটিতে কোনও বার্তা লগ করেছে তা দেখায়।

আমার সি ++ সিনট্যাক্সটি বেশ সঠিক হতে পারে না।


4
আপনি এটির সাথে কী করার চেষ্টা করছেন? "##" ব্যতীত এটি ঠিক কাজ করবে, যেহেতু টোকেন-পেস্ট করার দরকার নেই, "টুপি" করতে হবে। আপনি কি স্ট্রিংফাইজ করার চেষ্টা করছেন? এছাড়াও, ফাইল এবং লাইন অবশ্যই বড় হাতের মধ্যে থাকা উচিত, ছোট হাতের অক্ষরে নয়।
বিকে

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