উত্তরের দুটি অংশ রয়েছে। সংযোগকারী স্তরে সামঞ্জস্যতা এবং লিঙ্কার স্তরে সামঞ্জস্য। প্রাক্তন দিয়ে শুরু করা যাক।
ধরা যাক সমস্ত শিরোনাম সি ++ 11-এ লেখা হয়েছিল
একই সংকলক ব্যবহারের অর্থ হ'ল লক্ষ্য সি ++ স্ট্যান্ডার্ড নির্বিশেষে একই স্ট্যান্ডার্ড লাইব্রেরির শিরোনাম এবং উত্স ফাইলগুলি (সংকলকের সাথে সম্পর্কিত অঙ্গেস) ব্যবহৃত হবে। অতএব, স্ট্যান্ডার্ড লাইব্রেরির হেডার ফাইলগুলি সংকলক দ্বারা সমর্থিত সমস্ত সি ++ সংস্করণের সাথে সামঞ্জস্যপূর্ণ হতে লেখা হয়।
এতে বলা হয়েছে, যদি সংকলক বিকল্পগুলি কোনও অনুবাদ ইউনিট সংকলন করতে ব্যবহৃত হয় তবে নির্দিষ্ট সি ++ স্ট্যান্ডার্ড নির্দিষ্ট করে, তবে কেবলমাত্র নতুন মানগুলিতে যে কোনও বৈশিষ্ট্য উপলব্ধ তা অ্যাক্সেসযোগ্য হবে না। এটি __cplusplus
নির্দেশ ব্যবহার করে করা হয় । এটি কীভাবে ব্যবহার করা হয় তার একটি আকর্ষণীয় উদাহরণের জন্য ভেক্টর উত্স ফাইলটি দেখুন । একইভাবে, সংকলকটি স্ট্যান্ডার্ডের নতুন সংস্করণগুলির দ্বারা প্রদত্ত যে কোনও সিনট্যাকটিক বৈশিষ্ট্যগুলি প্রত্যাখ্যান করবে।
এর সবকটির অর্থ হ'ল আপনার অনুমান কেবলমাত্র আপনার লেখা শিরোনাম ফাইলগুলিতে প্রয়োগ হতে পারে। যখন বিভিন্ন সি ++ স্ট্যান্ডার্ডকে লক্ষ্য করে বিভিন্ন অনুবাদ ইউনিটে অন্তর্ভুক্ত করা হয় তখন এই শিরোনাম ফাইলগুলি অসঙ্গতিগুলির কারণ হতে পারে। এটি সি ++ স্ট্যান্ডার্ডের এনেক্সেক্স সিটিতে আলোচনা করা হয়েছে। এখানে 4 টি ধারা রয়েছে, আমি কেবল প্রথমটিই আলোচনা করব এবং বাকী অংশটি সংক্ষেপে উল্লেখ করব।
C.3.1 ধারা 2: লিক্সিক কনভেনশনস
একক উদ্ধৃতিগুলি সি ++ 11-তে একটি অক্ষরকে আক্ষরিক আকারে সীমাবদ্ধ করে, যেখানে তারা সি ++ 14 এবং সি ++ 17 তে অঙ্ক বিভাজনকারী হয়। ধরে নিন আপনার খাঁটি সি ++ 11 শিরোনাম ফাইলগুলির মধ্যে একটিতে নিম্নলিখিত ম্যাক্রো সংজ্ঞা রয়েছে:
#define M(x, ...) __VA_ARGS__
int x[2] = { M(1'2,3'4) };
শিরোনাম ফাইল অন্তর্ভুক্ত দুটি অনুবাদ ইউনিট বিবেচনা করুন, কিন্তু যথাক্রমে সি ++ 11 এবং সি ++ 14 লক্ষ্য করুন। সি ++ ১১ টার্গেট করার সময়, উদ্ধৃতিগুলির মধ্যে থাকা কমাটিকে প্যারামিটার বিভাজক হিসাবে বিবেচনা করা হয় না; শুধুমাত্র একবার প্যারামিটার আছে। সুতরাং, কোডটি সমান হবে:
int x[2] = { 0 };
অন্যদিকে, সি ++ 14 লক্ষ্য করার সময়, একক উদ্ধৃতিগুলি অঙ্ক বিভাজক হিসাবে ব্যাখ্যা করা হয়। সুতরাং, কোডটি সমান হবে:
int x[2] = { 34, 0 };
এখানে মূল বক্তব্যটি হ'ল খাঁটি সি ++ 11 শিরোনামের ফাইলগুলির মধ্যে একটিতে একক উদ্ধৃতি ব্যবহার করার ফলে সি ++ 14/17 লক্ষ্য করে এমন অনুবাদ ইউনিটগুলিতে বিস্ময়কর বাগগুলি আসতে পারে। সুতরাং, এমনকি যদি একটি শিরোলেখ ফাইল সি ++ 11 এ লিখিত হয় তবে এটি স্ট্যান্ডার্ডের পরবর্তী সংস্করণগুলির সাথে উপযুক্ত কিনা তা নিশ্চিত করার জন্য এটি সাবধানতার সাথে লিখতে হবে। দ্য__cplusplus
ডিরেক্টিভের এখানে দরকারী হতে পারে।
স্ট্যান্ডার্ড থেকে অন্য তিনটি ধারাগুলির মধ্যে রয়েছে:
C.3.2 ধারা 3: মৌলিক ধারণা
পরিবর্তন : নতুন স্বাভাবিক (প্লেসমেন্ট না করা) ডিওলোকেটর
যুক্তিযুক্ত : মাপের অবনতির জন্য প্রয়োজনীয়।
মূল বৈশিষ্ট্যের উপর প্রভাব : বৈধ সি ++ ২০১১ কোডটি বিশ্বব্যাপী স্থান নির্ধারণের বরাদ্দকরণের ক্রিয়াকলাপ এবং ডিওলোকেশন ফাংশনটি নীচে ঘোষণা করতে পারে:
void operator new(std::size_t, std::size_t);
void operator delete(void*, std::size_t) noexcept;
এই আন্তর্জাতিক স্ট্যান্ডার্ডে তবে অপারেটর মোছার ঘোষণাটি পূর্বনির্ধারিত স্বাভাবিক (অ-স্থান নির্ধারণ) অপারেটর মুছার (3.7.4) সাথে মেলে। যদি তা হয় তবে প্রোগ্রামটি দুর্গঠিত, যেমন এটি শ্রেণীর সদস্য বরাদ্দকরণের কাজ এবং অবনতি কার্য (5.3.4) জন্য ছিল 5
C.3.3 ধারা 7: ঘোষণা
পরিবর্তন : কনটেক্সটপ্রন অ-স্ট্যাটিক সদস্য ফাংশনগুলি স্পষ্টভাবে সদস্য ফাংশনগুলি গঠন করে না।
নীতি : প্রয়োজনীয় constexpr সদস্য ফাংশন বস্তুর পরিবর্তন ঘটান রাখার অনুমতি দেয়।
মূল বৈশিষ্ট্যের উপর প্রভাব : বৈধ সি ++ 2011 কোড এই আন্তর্জাতিক স্ট্যান্ডার্ডে সংকলন করতে ব্যর্থ হতে পারে।
উদাহরণস্বরূপ, নিম্নলিখিত কোডটি সি ++ ২০১১-তে বৈধ তবে এই আন্তর্জাতিক স্ট্যান্ডার্ডে এটি অবৈধ কারণ এটি একই সদস্যের ফাংশনটিকে বিভিন্ন ফেরতের প্রকারের সাথে দুবার ঘোষণা করে:
struct S {
constexpr const int &f();
int &f();
};
C.3.4 ধারা 27: ইনপুট / আউটপুট লাইব্রেরি
পরিবর্তন : গেটস সংজ্ঞায়িত করা হয় না।
যুক্তি: গেসের ব্যবহার বিপজ্জনক বলে মনে করা হয়।
মূল বৈশিষ্ট্যটির উপর প্রভাব : কার্যকর সি ++ 2011 কোড যা ব্যবহারের ফাংশন ব্যবহার করে তা এই আন্তর্জাতিক স্ট্যান্ডার্ডে সংকলন করতে ব্যর্থ হতে পারে।
C ++ 14 এবং C ++ 17 এর মধ্যে সম্ভাব্য অসুবিধাগুলি C.4 এ আলোচনা করা হয়েছে। যেহেতু সমস্ত অ-মানক শিরোলেখ ফাইলগুলি সি ++ 11 তে লিখিত (প্রশ্নে বর্ণিত), এই সমস্যাগুলি আসবে না, তাই আমি এখানে তাদের উল্লেখ করব না।
এখন আমি লিঙ্কার স্তরে সামঞ্জস্যতা নিয়ে আলোচনা করব। সাধারণভাবে, অসঙ্গতিগুলির সম্ভাব্য কারণগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:
যদি ফলাফল অবজেক্ট ফাইলের ফর্ম্যাটটি লক্ষ্য সি ++ স্ট্যান্ডার্ডের উপর নির্ভর করে তবে লিঙ্কারটিকে অবশ্যই বিভিন্ন অবজেক্ট ফাইলগুলিতে লিঙ্ক করতে সক্ষম হতে হবে। জিসিসি, এলএলভিএম, এবং ভিসি ++ এ ভাগ্যক্রমে ঘটনাটি নয়। এটি হ'ল, লক্ষ্য মান নির্বিশেষে অবজেক্ট ফাইলগুলির ফর্ম্যাটটি একই, যদিও এটি সংকলক নিজেই অত্যন্ত নির্ভরশীল। প্রকৃতপক্ষে, জিসিসি, এলএলভিএম, এবং ভিসি ++ এর লিঙ্কারগুলির কোনওটিরই লক্ষ্য সি ++ স্ট্যান্ডার্ড সম্পর্কে জ্ঞানের প্রয়োজন নেই। এর অর্থ হ'ল আমরা ইতিমধ্যে সংকলিত অবজেক্ট ফাইলগুলিকে লিঙ্ক করতে পারি (স্ট্যাটিক্যালি রানটাইমকে সংযুক্ত করে)।
যদি প্রোগ্রাম স্টার্টআপ রুটিন (যে ফাংশনটি কল করে main
) বিভিন্ন সি ++ মানের জন্য আলাদা হয় এবং বিভিন্ন রুটিনগুলি একে অপরের সাথে সামঞ্জস্য না করে তবে অবজেক্ট ফাইলগুলিতে লিঙ্ক করা সম্ভব হবে না। জিসিসি, এলএলভিএম, এবং ভিসি ++ এ ভাগ্যক্রমে ঘটনাটি নয়। এছাড়াও, স্বাক্ষরmain
ফাংশনের (এবং এটিতে যে বিধিনিষেধগুলি প্রযোজ্য, মান বিভাগের 3.6 দেখুন) সমস্ত সি ++ মানদণ্ডে সমান, তাই এটি কোন অনুবাদ ইউনিটে বিদ্যমান তা বিবেচ্য নয়।
সাধারণভাবে, ডব্লিউপিও বিভিন্ন সি ++ স্ট্যান্ডার্ড ব্যবহার করে সংকলিত অবজেক্ট ফাইলগুলির সাথে ভালভাবে কাজ করতে পারে না। এটি ঠিক নির্ভর করে যে সংকলকটির কোন পর্যায়ে লক্ষ্য মান সম্পর্কে জ্ঞান প্রয়োজন এবং কোন ধাপগুলি নয় এবং এটি ইন্টার-প্রসেসরাল অপটিমাইজেশনের উপর যে প্রভাব ফেলে যা বস্তু ফাইলগুলি অতিক্রম করে। ভাগ্যক্রমে, জিসিসি, এলএলভিএম, এবং ভিসি ++ ভালভাবে ডিজাইন করা হয়েছে এবং এই সমস্যাটি নেই (এটি সম্পর্কে আমি অবগত নই)।
অতএব, জিসিসি, এলএলভিএম, এবং ভিসি ++ সি ++ স্ট্যান্ডার্ডের বিভিন্ন সংস্করণে বাইনারি সামঞ্জস্যতা সক্ষম করার জন্য ডিজাইন করা হয়েছে । যদিও এটি সত্যই নিজের প্রয়োজনের সত্য নয়।
যাইহোক, যদিও উপাচার্য ++ সংকলকটি স্টাডি সুইচ সরবরাহ করে , যা আপনাকে সি ++ স্ট্যান্ডার্ডের একটি নির্দিষ্ট সংস্করণ লক্ষ্য করতে সক্ষম করে, এটি সি ++ 11 লক্ষ্য করে সমর্থন করে না। নির্দিষ্ট করা যেতে পারে এমন সর্বনিম্ন সংস্করণটি হ'ল সি ++ ১৪, যা ভিজ্যুয়াল সি ++ 2013 আপডেট 3 থেকে শুরু হওয়া ডিফল্ট C বিভিন্ন অনুবাদ ইউনিটগুলি সংকলন করতে পারেন যা সি ++ স্ট্যান্ডার্ডের বিভিন্ন সংস্করণকে লক্ষ্য করে, যা খুব কমপক্ষে ডাব্লুপিও ভেঙে দেয়।
ক্যাভেট: আমার উত্তর সম্পূর্ণ বা খুব সুনির্দিষ্ট নাও হতে পারে।