সি লাইব্রেরি কেন একই নামের সাথে ম্যাক্রোগুলি এবং ফাংশন ব্যবহার করে?


20

আমি পি জে প্লুগার দ্বারা 'স্ট্যান্ডার্ড সি লাইব্রেরি' পড়ছি যা সত্যই আকর্ষণীয়। বইটি কেবল গ্রন্থাগারটি কীভাবে ব্যবহার করতে হয় তা নয়, কীভাবে এটি প্রয়োগ করা হয় তাও ব্যাখ্যা করে।

আমি ctype.hবিভাগটি পড়া শেষ করেছি এবং শিরোনামে ফাংশনগুলি ম্যাক্রো এবং ফাংশন উভয় হিসাবে ঘোষণা করা হয়েছে। উদাহরণ স্বরূপ

int isdigit(int);

কিন্তু

#define isdigit(c) (_Ctype[(int)(c)] & _DI)

আমি বুঝতে পারছি না কেন দুটি ব্যবহার করা হয়?

এছাড়াও, যদি আমি আমার নিজস্ব কাস্টম ctypeশিরোনাম এবং বাস্তবায়নটি পুনরায় তৈরি করার চেষ্টা করি, তবে আমি কেবলমাত্র ম্যাক্রো সরিয়ে দিলে সফলভাবে সংকলন করতে পারি (সংজ্ঞায়িত করে মন্তব্য করুন)।

এই দিকটি বইটিতে আসলে ব্যাখ্যা করা হয়নি। কেউ দয়া করে ব্যাখ্যা করতে পারেন?


কোনও সংকলককে ম্যাক্রো হিসাবে প্রয়োগ করতে জোর করে সি স্ট্যান্ডার্ডে কিছুই নেই। ম্যাক্রো সম্ভবত পুরানো দিনগুলির একটি অবশিষ্টাংশ যখন সি ইনলাইনিং ছিল না। যদিও কোনও স্মার্ট সংকলক প্রয়োজনের ক্ষেত্রে সেই ফাংশনটি ইনলাইন করতে সক্ষম হওয়া উচিত, একটি স্পষ্ট ইনলাইন কীওয়ার্ড ছাড়াই। সুতরাং ফাংশনটির মতো ম্যাক্রো কেবল সেখানে রয়েছে কারণ সংকলক এমন কেউ দ্বারা বাস্তবায়িত হয়েছিল যিনি সংকলক তৈরি করতে উজ্জ্বল ছিলেন না।

উত্তর:


23

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

ফাংশন কলটি একই লাইব্রেরির সাথে সংযোগ স্থাপনের অনুমতি দেয় এমনকি ম্যাক্রো সংজ্ঞা ব্যতীত প্রোগ্রামটি সংকলন করা হয় - যদি এটি একটি ভিন্ন শিরোনামের সাথে সংকলিত করা হয়, বা উত্স ফাইলের ভিতরে একটি দুর্বৃত্ত ঘোষণার সাহায্যে। উদাহরণস্বরূপ, আপনার কাছে এমন একটি সংকলক থাকা উচিত যাতে কারওর সিটিপিএইচ। র "উন্নত" সংস্করণ রয়েছে করা হয়নি ম্যাক্রো আছে, ফাংশন এখনও ব্যবহারের জন্য রানটাইম অস্তিত্ব হবে।

যদি আমরা স্ট্যান্ডার্ডটি দেখি:

.1.১.৪ গ্রন্থাগারের কার্যাদি ব্যবহার

শিরোনামে ঘোষিত যে কোনও ফাংশন অতিরিক্তভাবে ফাংশন-জাতীয় ম্যাক্রো ডি-এনড হিসাবে শিরোলেখ হিসাবে প্রয়োগ করা যেতে পারে, সুতরাং যদি কোনও লাইব্রেরির ফাংশন যদি তার শিরোলেখ অন্তর্ভুক্ত থাকে তখন স্পষ্টভাবে ঘোষণা করা হয়, ঘোষণাটি নিশ্চিত করার জন্য নীচে প্রদর্শিত কৌশলগুলির মধ্যে একটি ব্যবহার করা যেতে পারে যেমন একটি ম্যাক্রো দ্বারা প্রভাবিত। কোনও ফাংশনটির যেকোন ম্যাক্রো ডিফিনেশন স্থানীয়ভাবে ফাংশনটির নাম বন্ধনীতে সংযুক্ত করে দমন করা যেতে পারে, কারণ নামটি পরে বাম বন্ধনী দ্বারা অনুসরণ করা হয় না যা ম্যাক্রো ফাংশন নামের প্রসারকে নির্দেশ করে। একই সিনট্যাকটিক কারণে, এটি কোনও ম্যাক্রো হিসাবে স্বীকৃত হলেও লাইব্রেরির ফাংশনটির ঠিকানা নেওয়ার অনুমতি রয়েছে।

এর অর্থ হ'ল আপনি যদি লিখেন:

int b = (isdigit)(c);

অথবা

int (*f)(int) = &isdigit;
int b = f(c);

তারপরে আপনি ম্যাক্রো নয়, আসল ফাংশনটি চালু করছেন। আপনি আইনীভাবেও লিখতে পারেন:

#undef isdigit
int b = isdigit(c);

বা (কোনও উত্স ফাইলটিতে #include <ctype.h>প্রত্যক্ষ বা ট্রানজিটিভলি নেই):

extern int isdigit(int);
int b = isdigit(c);

ম্যাক্রো সংজ্ঞা ব্যতীত প্রোগ্রামটি কীভাবে সংকলন করা যায়?
ব্যবহারকারী 619818

extern int isdigit(int)উদাহরণস্বরূপ @ ব্যবহারকারী 619818 ব্যবহার করে ।
ইকত্মুর

ঠিক তাই আমি স্পষ্ট, আপনার অর্থ ব্যবহারকারীর কোনও # অন্তর্ভুক্ত <নেই যাই হোক না কেন এর পরিবর্তে int isdigit (int) যুক্ত করুন; বাস্তবায়ন ফাইলের শীর্ষে। ঠিক আছে, আপনার প্রতিক্রিয়াটি সঠিকভাবে পড়ুন।
ব্যবহারকারী 619818

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