ভাষা স্পেসিফিকেশন পারবেন বাস্তবায়নের বাস্তবায়ন <cmath>
প্রকাশক (এবং সংজ্ঞা) এ মান ফাংশন দ্বারা বিশ্বব্যাপী নামস্থান এবং তারপর তাদের নামস্থান মধ্যে আনয়ন std
ব্যবহার-ঘোষণা মাধ্যমে। এই পদ্ধতির ব্যবহার হয়েছে কিনা তা অনির্দিষ্ট
20.5.1.2 শিরোলেখ
4 [...] সি ++ স্ট্যান্ডার্ড লাইব্রেরিতে, তবে, ঘোষণাগুলি (সিতে ম্যাক্রো হিসাবে সংজ্ঞায়িত নামগুলি বাদে) নামের স্থানটির নাম স্থানের (6.3.6) মধ্যে রয়েছে std
। এই নামগুলি (ক্লজ 21 মাধ্যমে 33 এবং আনেক্স ডি-তে যোগ হওয়া কোনও ওভারলোড সহ) প্রথমে বিশ্বব্যাপী নেমস্পেসের স্কোপের মধ্যে ঘোষণা করা হয়েছে এবং তারপরে std
সুস্পষ্টভাবে ব্যবহারের মাধ্যমে ঘোষণার মাধ্যমে (10.3.3) নেমস্পেসে ইনজেকশন দেওয়া আছে কিনা তা অনির্দিষ্ট ified
স্পষ্টতই, আপনি যে কোনও বাস্তবায়নের সাথে মোকাবিলা করছেন যা এই পদ্ধতির অনুসরণ করার সিদ্ধান্ত নিয়েছে (যেমন জিসিসি)। যেমন আপনার বাস্তবায়ন সরবরাহ করে ::abs
, যখন std::abs
কেবল "রেফারেন্স" দেয় ::abs
।
এক্ষেত্রে একটি প্রশ্ন রয়ে গেছে যা মানক ছাড়াও আপনি কেন ::abs
নিজের ঘোষণা করতে পেরেছিলেন ::abs
, অর্থাত্ কেন একাধিক সংজ্ঞা ত্রুটি নেই। এটি কিছু বাস্তবায়ন (যেমন জিসিসি) দ্বারা সরবরাহিত অন্য কোনও বৈশিষ্ট্যের কারণে ঘটতে পারে: তারা স্ট্যান্ডার্ড ফাংশনগুলিকে তথাকথিত দুর্বল প্রতীক হিসাবে ঘোষণা করে , সুতরাং এটি আপনাকে নিজের সংজ্ঞা দিয়ে তাদের "প্রতিস্থাপন" করতে দেয়।
এই দুটি কারণ একসাথে আপনি যে প্রভাবটি লক্ষ্য করেন তা তৈরি করে: দুর্বল-প্রতীক প্রতিস্থাপনের ফলে প্রতিস্থাপনের ::abs
ফলস্বরূপ std::abs
। ভাষার মানের সাথে এটি কতটা ভালভাবে একমত হয় তা অন্যরকম গল্প ... কোনও অবস্থাতেই, এই আচরণের উপর নির্ভর করবেন না - এটি ভাষা দ্বারা গ্যারান্টিযুক্ত নয়।
জিসিসিতে এই আচরণটি নিম্নোক্ত উদাহরণ সহকারে পুনরুত্পাদন করা যেতে পারে। একটি উত্স ফাইল
#include <iostream>
void foo() __attribute__((weak));
void foo() { std::cout << "Hello!" << std::endl; }
অন্য উত্স ফাইল
#include <iostream>
void foo();
namespace N { using ::foo; }
void foo() { std::cout << "Goodbye!" << std::endl; }
int main()
{
foo();
N::foo();
}
এই ক্ষেত্রে আপনি আরও লক্ষ্য করবেন যে দ্বিতীয় উত্স ফাইলে ::foo
( "Goodbye!"
) এর নতুন সংজ্ঞাটি এর আচরণকেও প্রভাবিত করে N::foo
। উভয় কল আউটপুট হবে "Goodbye!"
। এবং যদি আপনি ::foo
দ্বিতীয় উত্স ফাইল থেকে সংজ্ঞাটি সরিয়ে থাকেন তবে উভয় কলই "মূল" সংজ্ঞা ::foo
এবং আউটপুট প্রেরণ করবে "Hello!"
।
উপরের 20.5.1.2/4 দ্বারা প্রদত্ত অনুমতিটি এর বাস্তবায়ন সহজ করার জন্য রয়েছে <cmath>
। বাস্তবায়নগুলিকে কেবল সি-স্টাইল অন্তর্ভুক্ত করার অনুমতি দেওয়া হয় <math.h>
, তারপরে ক্রিয়াকলাপগুলিকে পুনরায় ঘোষিত করতে std
এবং কিছু সি ++ যুক্ত করুন - নির্দিষ্ট সংযোজন এবং টুইটগুলি। যদি উপরের ব্যাখ্যাটি সমস্যার অভ্যন্তরীণ যান্ত্রিকভাবে সঠিকভাবে বর্ণনা করে, তবে এর একটি বড় অংশটি কার্যকারিতাগুলির সি-স্টাইল সংস্করণের দুর্বল চিহ্নগুলির প্রতিস্থাপনের উপর নির্ভর করে ।
মনে রাখবেন যদি কেবলমাত্র আমরা বিশ্বব্যাপী প্রতিস্থাপন int
সঙ্গে double
উপরে প্রোগ্রামে, কোড (জিসিসি অধীনে) "হিসাবে প্রত্যাশিত" আচরণ করবে - এটা আউটপুট হবে -5 5
। সি স্ট্যান্ডার্ড লাইব্রেরির abs(double)
কার্যকারিতা না থাকার কারণে এটি ঘটে । আমাদের নিজস্ব ঘোষণা দিয়ে abs(double)
, আমরা কিছু প্রতিস্থাপন করি না।
কিন্তু যদি থেকে স্যুইচ করার পরে int
সঙ্গে double
আমরা থেকে সুইচ abs
করতে fabs
, মূল অদ্ভুত আচরণ তার পূর্ণ গরিমা (আউটপুটে পুনরায় প্রদর্শিত হবে -5 -5
)।
এটি উপরোক্ত ব্যাখ্যার সাথে সামঞ্জস্যপূর্ণ।
abs
ভুল।