6.7.4 ফাংশন নির্দিষ্টকারী
C99 এর একটি নতুন বৈশিষ্ট্য:inline
শব্দ, সি থেকে অভিযোজিত ++ একটি হল ফাংশন-সুনির্দিষ্টভাবে উল্লেখ করা যে শুধুমাত্র ফাংশন ঘোষণা ব্যবহার করা যেতে পারে। এটি প্রোগ্রামের অপ্টিমাইজেশনের জন্য দরকারী যা কোনও ফাংশনের সংজ্ঞাটি কোনও কলটির সাইটে দৃশ্যমান হওয়া প্রয়োজন। (নোট করুন যে স্ট্যান্ডার্ড এই অপ্টিমাইজেশনের প্রকৃতি নির্দিষ্ট করার চেষ্টা করে না))
যদি ফাংশনটির অভ্যন্তরীণ সংযোগ থাকে, বা এর বাহ্যিক সংযোগ থাকে এবং কলটি বাহ্যিক সংজ্ঞা হিসাবে একই অনুবাদ ইউনিটে থাকে তবে দৃশ্যমানতা নিশ্চিত হয়ে থাকে। এই ক্ষেত্রে, inline
ফাংশনটির ঘোষণাপত্র বা সংজ্ঞায় মূলশব্দটির উপস্থিতি
কোনও অগ্রাধিকার নির্দেশ করার বাইরে কোনও প্রভাব রাখে না যে এই ফাংশনটির কলগুলি ছাড়াই ঘোষিত অন্যান্য ফাংশনের কলগুলির তুলনায় অনুকূলিত করা উচিতinline
কীওয়ার্ড
বাহ্যিক সংযোগ সহ কোনও ফাংশনের কল করার জন্য দৃশ্যমানতা একটি সমস্যা যেখানে কলটি ফাংশনের সংজ্ঞা থেকে আলাদা অনুবাদ ইউনিটে রয়েছে। এই ক্ষেত্রে,inline
কীওয়ার্ডটি কল সম্বলিত অনুবাদ ইউনিটটিকে ফাংশনটির একটি স্থানীয়, বা ইনলাইন, সংজ্ঞা থাকতে দেয়।
একটি প্রোগ্রামে একটি বাহ্যিক সংজ্ঞা সহ একটি অনুবাদ ইউনিট, একটি ইনলাইন সংজ্ঞা সহ একটি অনুবাদ ইউনিট, এবং একটি ঘোষণার সাথে একটি অনুবাদ ইউনিট থাকতে পারে তবে কোনও কার্যের জন্য কোনও সংজ্ঞা থাকতে পারে। পরবর্তী অনুবাদ ইউনিটে কলগুলি যথারীতি বাহ্যিক সংজ্ঞা ব্যবহার করবে।
কোনও ফাংশনের একটি ইনলাইন সংজ্ঞা বাহ্যিক সংজ্ঞা থেকে আলাদা সংজ্ঞা হিসাবে বিবেচিত হয়। যদি func
কোনও ইনলাইন সংজ্ঞা দৃশ্যমান থাকে তবে বাহ্যিক সংযোগের সাথে কোনও ফাংশনে কল যদি ঘটে থাকে তবে আচরণটি একই রকম হয় যেমন কলটি অন্য কোনও ফাংশনে করা হয়েছিল, বলুন __func
, অভ্যন্তরীণ সংযোগের সাথে বলুন
। একটি কনফার্মিং প্রোগ্রাম অবশ্যই কোন ফাংশন বলা হয় তার উপর নির্ভর করে না। এটি স্ট্যান্ডার্ডের ইনলাইন মডেল।
একটি আনুষঙ্গিক প্রোগ্রাম অবশ্যই ইনলাইন সংজ্ঞা ব্যবহার করে বাস্তবায়নের উপর নির্ভর করতে পারে না, বা বাহ্যিক সংজ্ঞা ব্যবহার করে এটি বাস্তবায়নের উপর নির্ভর করতে পারে না। কোনও ফাংশনের ঠিকানা সর্বদা ঠিকানা বহিরাগত সংজ্ঞার সাথে সম্পর্কিত, তবে যখন এই ঠিকানাটি ফাংশনটি কল করতে ব্যবহৃত হয়, তখন ইনলাইন সংজ্ঞা ব্যবহৃত হতে পারে। অতএব, নিম্নলিখিত উদাহরণটি প্রত্যাশার মতো আচরণ করবে না।
inline const char *saddr(void)
{
static const char name[] = "saddr";
return name;
}
int compare_name(void)
{
return saddr() == saddr();
}
যেহেতু বাস্তবায়ন কোনও কলের জন্য ইনলাইন সংজ্ঞাটি ব্যবহার করতে পারে saddr
এবং অন্যটির জন্য বাহ্যিক সংজ্ঞা ব্যবহার করতে পারে তাই সমতা অপারেশনটি 1 (সত্য) এর মূল্যায়ন করার গ্যারান্টিযুক্ত নয়। এটি দেখায় যে ইনলাইন সংজ্ঞার মধ্যে সংজ্ঞায়িত স্থিতিক বস্তুগুলি বাহ্যিক সংজ্ঞায় তাদের সংশ্লিষ্ট বস্তু থেকে পৃথক। এটি এমনকি একটি অ-const
এই ধরণের অবজেক্টকে ।
ইনলাইনিং স্ট্যান্ডার্ডে এমনভাবে যুক্ত করা হয়েছিল যাতে এটি বিদ্যমান লিঙ্কার প্রযুক্তির সাথে প্রয়োগ করা যেতে পারে এবং সি 99 ইনলাইনিংয়ের একটি উপসেট সি ++ এর সাথে সামঞ্জস্যপূর্ণ। এটি একটি ইনলাইন ফাংশন সংজ্ঞা সমন্বিত একটি অনুবাদ ইউনিট ফাংশন জন্য বাহ্যিক সংজ্ঞা প্রদান করে যে হিসাবে নির্দিষ্ট করা প্রয়োজন প্রয়োজন দ্বারা অর্জন করা হয়েছিল। কারণ সেই স্পেসিফিকেশনটি কেবলমাত্র এমন একটি ঘোষণার সমন্বয়ে গঠিত হয় যা হয় inline
কীওয়ার্ডের অভাব হয় বা এতে উভয়ই থাকে inline
এবং extern
এটি একটি সি ++ অনুবাদক দ্বারাও গৃহীত হবে।
C99 ইনলাইনিং দুটি উপায়ে সি ++ নির্দিষ্টকরণ প্রসারিত করে। প্রথমত, যদি একটি inline
অনুবাদ ইউনিটে কোনও ফাংশন ঘোষণা করা
হয়, তবে এটি inline
অন্য প্রতিটি অনুবাদ ইউনিটে ঘোষণা করার দরকার নেই । এটি উদাহরণস্বরূপ, একটি লাইব্রেরির ক্রিয়াকলাপটিকে অনুমতি দেয় যা গ্রন্থাগারের মধ্যে অন্তর্ভুক্ত করা যায় তবে কেবল অন্য কোথাও একটি বাহ্যিক সংজ্ঞার মাধ্যমে উপলব্ধ। বাহ্যিক ফাংশনের জন্য একটি মোড়ক ফাংশন ব্যবহারের বিকল্পের জন্য একটি অতিরিক্ত নাম প্রয়োজন; এবং যদি অনুবাদক প্রকৃতপক্ষে ইনলাইন প্রতিস্থাপন না করে তবে এটি কার্যক্ষমতাতেও বিরূপ প্রভাব ফেলতে পারে।
দ্বিতীয়ত, একটি ইনলাইন ফাংশনের সমস্ত সংজ্ঞা "হুবহু একই" হওয়া আবশ্যকতার সাথে প্রয়োজনীয়তাটি প্রতিস্থাপন করা হয় যে কোনও কলটি একটি দৃশ্যমান ইনলাইন সংজ্ঞা, বা বাহ্যিক সংজ্ঞা সহ কল প্রয়োগ করা হয় কিনা তার উপর নির্ভর করে না প্রোগ্রামটির আচরণ নির্ভর করে না ফাংশন এটি একটি নির্দিষ্ট অনুবাদ ইউনিটের মধ্যে একটি ইনলাইন সংজ্ঞা ব্যবহারের জন্য বিশেষীকরণ করার অনুমতি দেয়। উদাহরণস্বরূপ, গ্রন্থাগারের ফাংশনের বাহ্যিক সংজ্ঞায় কিছু যুক্তি যাচাইকরণ অন্তর্ভুক্ত থাকতে পারে যা একই লাইব্রেরির অন্যান্য ফাংশন থেকে কল করার জন্য প্রয়োজন হয় না। এই এক্সটেনশনগুলি কিছু সুবিধা দেয়; এবং প্রোগ্রামাররা যারা সামঞ্জস্যের বিষয়ে উদ্বিগ্ন তারা কেবল কঠোরতর সি ++ নিয়ম মেনে চলতে পারে।
দ্রষ্টব্য যে মানক শিরোনামগুলিতে স্ট্যান্ডার্ড লাইব্রেরি ফাংশনের ইনলাইন সংজ্ঞা প্রদান করা বাস্তবায়নের পক্ষে যথাযথ নয় কারণ এটি কিছু লিগ্যাসি কোডটি ভেঙে দিতে পারে যা তাদের শিরোনামগুলি অন্তর্ভুক্ত করার পরে মানক লাইব্রেরি ফাংশনগুলিকে পুনরায় ঘোষিত করে। inline
শব্দ শুধুমাত্র ফাংশন ইনলাইনিং সুপারিশ পোর্টেবল পথ সঙ্গে ব্যবহারকারীদের প্রদান উদ্দীষ্ট। স্ট্যান্ডার্ড শিরোনামগুলি পোর্টেবলের প্রয়োজন হয় না বিধায় বাস্তবায়নের লাইনগুলি সহ অন্যান্য বিকল্প রয়েছে:
#define abs(x) __builtin_abs(x)
অথবা স্ট্যান্ডার্ড লাইব্রেরি ফাংশনগুলি ইনলাইন করার জন্য অন্যান্য অ-বহনযোগ্য ব্যবস্থা।