সি ++ 17, সি ++ 14 এবং সি ++ 11 অবজেক্টগুলিকে লিঙ্ক করা কি নিরাপদ?


103

ধরুন আমার কাছে তিনটি সংকলিত অবজেক্ট রয়েছে যা সমস্ত একই সংকলক / সংস্করণ দ্বারা উত্পাদিত হয়েছে :

  1. এ সি ++ 11 স্ট্যান্ডার্ড দিয়ে সংকলিত হয়েছিল
  2. বি সি ++ 14 স্ট্যান্ডার্ড দিয়ে সংকলিত হয়েছিল
  3. সি সি ++ 17 স্ট্যান্ডার্ড দিয়ে সংকলিত হয়েছিল

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

এই বস্তুর কোন সমন্বয় এটি এবং এটি একটি বাইনারি মধ্যে লিঙ্ক করা নিরাপদ নয়? কেন?


সম্পাদনা: বড় সংকলকগুলি (যেমন জিসিসি, ঝনঝন, বনাম ++) কভার উত্তরগুলি স্বাগত


6
কোনও স্কুল / সাক্ষাত্কারের প্রশ্ন নয়। প্রশ্নটি একটি বিশেষ কেস থেকে উদ্ভূত: আমি একটি প্রকল্পে কাজ করছি যা একটি ওপেন-সোর্স লাইব্রেরির উপর নির্ভর করে। আমি উত্স থেকে এই লাইব্রেরিটি তৈরি করি তবে এর বিল্ড সিস্টেমটি কেবলমাত্র C ++ 03 / C ++ 11 বিল্ডিংয়ের মধ্যে চয়ন করতে একটি পতাকা গ্রহণ করে। আমি যে সংকলনটি ব্যবহার করি তা অন্য মানগুলিকে সমর্থন করে এবং আমি নিজের প্রকল্পটি সি ++ 17 এ উন্নীত করার বিষয়ে বিবেচনা করছি। এটি নিরাপদ সিদ্ধান্ত কিনা তা নিয়ে আমি নিশ্চিত নই। এবিআই বা অন্য কোনও উপায়ে কোনও উপায় রয়েছে যেখানে এই পদ্ধতির পরামর্শ দেওয়া হয় না? আমি একটি পরিষ্কার উত্তর খুঁজে পাইনি এবং সাধারণ কেস সম্পর্কে একটি প্রশ্ন পোস্ট করার সিদ্ধান্ত নিয়েছি।
রিচাব

6
এটি সম্পূর্ণরূপে সংকলকটির উপর নির্ভর করে। এই পরিস্থিতি নিয়ন্ত্রণ করে এমন আনুষ্ঠানিক সি ++ নির্দিষ্টকরণের কিছুই নেই। একটি ছোট্ট সম্ভাবনাও রয়েছে যে কোডটি সি ++ 03 বা সি + 11 স্ট্যান্ডার্ডে লিখিত হয়েছিল তাতে সি ++ 14 এবং সি ++ 17 স্তরে কিছু সমস্যা থাকবে। পর্যাপ্ত জ্ঞান এবং অভিজ্ঞতা (এবং শুরুতে ভাল লিখিত কোড) দিয়ে, এই সমস্যার যে কোনও একটি সমাধান করা সম্ভব হওয়া উচিত। আপনি যদি নতুন সি ++ স্ট্যান্ডার্ডের সাথে খুব পরিচিত না হন তবে আপনি বিল্ড সিস্টেমটি কী সমর্থন করে তা স্থির করে রাখা আরও ভাল।
স্যাম বর্ষাভিক

10
@ সোমোপ্রগ্রামমারডুড: এটি একটি অত্যন্ত সার্থক প্রশ্ন। আমি আশা করি আমার একটি উত্তর আছে। আমি কেবল জানি, আরএইচইএল ডিভলটোসেটের মাধ্যমে লিবিস্টডি ++ নকশার মাধ্যমে পিছনে সামঞ্জস্যপূর্ণ, স্থিরভাবে নতুন স্টাফের সাথে সংযোগ স্থাপন করে এবং ডিস্ট্রোর "নেটিভ" লাইবস্টডিসি ++ ব্যবহার করে রানটাইমটিতে গতিশীল সমাধানের জন্য পুরানো স্টাফ রেখে। কিন্তু যে প্রশ্নের উত্তর দেয় না।
অরবিট

4
@ এনএম: ... যা বেশিরভাগ ক্ষেত্রেই হয় ... বিতরণ-স্বতন্ত্র সি ++ লাইব্রেরি বিতরণকারী প্রত্যেকেই (1) গতিশীল লাইব্রেরি ফর্ম এবং (2) ইন্টারফেসের সীমানায় সি ++ স্ট্যান্ডার্ড লাইব্রেরি পাত্রে না করেই করেন। লিনাক্স বিতরণ থেকে আসা লাইব্রেরিগুলিতে এগুলি সহজ হয় কারণ এগুলি সমস্ত একই সংকলক, একই স্ট্যান্ডার্ড লাইব্রেরি এবং পতাকাগুলির অনেকগুলি একই ডিফল্ট সেট দ্বারা নির্মিত built
মাত্তেও ইটালিয়া

4
কেবলমাত্র @ ম্যাট্টিও ইটালিয়া থেকে " পূর্ববর্তী মন্তব্যটি স্পষ্ট করার জন্য এবং সি ++ 03 থেকে সি ++ 11 মোডে (বিশেষত স্ট্র্যান্ড :: স্ট্রিং) পরিবর্তন করার সময়।" এটি সত্য নয়, std::stringlibstdc ++ এ সক্রিয় প্রয়োগটি ব্যবহৃত মোডের থেকে পৃথক-stdস্পষ্টভাবে ওপি'র মতো পরিস্থিতিতে সমর্থন করার জন্য এটি একটি গুরুত্বপূর্ণ সম্পত্তি । আপনি std::stringসি ++ 03 কোডে নতুনটি ব্যবহার করতে পারেন এবং আপনি std::stringসি ++ 11 কোডে পুরানোটি ব্যবহার করতে পারেন (মাত্তির পরবর্তী মন্তব্যে লিংকটি দেখুন)।
জোনাথন ওয়াকলি

উত্তর:


123

এই বস্তুর কোন সমন্বয় এটি এবং এটি একটি বাইনারি মধ্যে লিঙ্ক করা নিরাপদ নয়? কেন?

জিসিসির পক্ষে এ, বি এবং সি এর সাথে যে কোনও বস্তুর সংমিশ্রণ করা নিরাপদ যদি সেগুলি সমস্ত একই সংস্করণ দিয়ে নির্মিত হয় তবে তারা এবিআই সামঞ্জস্যপূর্ণ, মানক সংস্করণ (অর্থাত্ -stdবিকল্প) কোনও পার্থক্য রাখে না।

কেন? কারণ এটি আমাদের বাস্তবায়নের একটি গুরুত্বপূর্ণ সম্পত্তি যা আমরা নিশ্চিত করতে কঠোর পরিশ্রম করি।

আপনি কোথায় সমস্যায় আপনি একসঙ্গে লিঙ্ক জিসিসি বিভিন্ন সংস্করণ সঙ্গে কম্পাইল বস্তু এবং যদি আপনি একটি নতুন C ++ স্ট্যান্ডার্ডের থেকে অস্থির বৈশিষ্ট্য ব্যবহার করেছেন যে আদর্শ জন্য জিসিসি সমর্থন আগে সম্পূর্ণ। উদাহরণস্বরূপ, আপনি যদি GCC 4.9 ব্যবহার করে -std=c++11কোনও বস্তু এবং GCC 5 দিয়ে অন্য কোনও বস্তু সংকলন করেন এবং -std=c++11আপনার সমস্যা হবে। সি ++ 11 সমর্থনটি জিসিসি 4.x-এ পরীক্ষামূলক ছিল এবং তাই সিসি 4.9 এবং সি ++ 11 বৈশিষ্ট্যের 5 সংস্করণগুলির মধ্যে বেমানান পরিবর্তনগুলি হয়েছিল। একইভাবে, আপনি যদি একটি জিসিসি 7 এবং -std=c++17অন্যটি জিসিসি 8 দিয়ে অন্য কোনও বস্তু সংকলন করেন এবং -std=c++17আপনার সমস্যা হবে কারণ জিসিসি 7 এবং 8 এ সি ++ 17 সমর্থন এখনও পরীক্ষামূলক এবং বিকশিত।

অন্যদিকে, নিম্নলিখিত অবজেক্টগুলির যে কোনও সংমিশ্রণ কাজ করবে (যদিও নীচে নোটটি দেখুন libstdc++.so সংস্করণ ):

  • অবজেক্ট ডি জিসিসি ৪.৯ এবং সংকলিত -std=c++03
  • অবজেক্ট ই জিসিসি 5 এবং এর সাথে সংকলিত -std=c++11
  • অবজেক্ট এফ জিসিসি 7 এবং এর সাথে সংকলিত -std=c++17

এটি কারণ C ++ 03 সমর্থন ব্যবহৃত তিনটি সংকলক সংস্করণ স্থিতিশীল এবং তাই সি ++ 03 উপাদান সমস্ত বস্তুর মধ্যে সামঞ্জস্যপূর্ণ। সি ++ 11 সমর্থন জিসিসি 5 থেকে স্থিতিশীল, তবে অবজেক্ট ডি কোনও সি ++ 11 বৈশিষ্ট্য ব্যবহার করে না এবং ই এবং এফ উভয়ই সংস্করণ ব্যবহার করে যেখানে সি ++ 11 সমর্থন স্থিতিশীল। সি ++ 17 সমর্থন ব্যবহৃত সংকলক সংস্করণগুলির যে কোনওটিতে স্থিতিশীল নয়, তবে কেবলমাত্র অবজেক্ট এফ সি ++ 17 বৈশিষ্ট্য ব্যবহার করে এবং তাই অন্য দুটি অবজেক্টের সাথে কোনও সামঞ্জস্যতার সমস্যা নেই (কেবলমাত্র তারা বৈশিষ্ট্যগুলি সি ++ 03 থেকে আসে বা সি ++ 11, এবং ব্যবহৃত সংস্করণগুলি সেই অংশগুলি ঠিক করে তোলে)। আপনি যদি পরে চতুর্থ অবজেক্ট, জি, সংকলন করতে চান তবে জিসিসি 8 এবং-std=c++17 তারপরে আপনাকে একই সংস্করণ (বা এফ-এর লিঙ্ক না) দিয়ে পুনরায় করতে হবে কারণ এফ এবং জি-তে C ++ 17 চিহ্নগুলি বেমানান।

ডি, ই এবং এফ এর মধ্যে উপরে বর্ণিত সামঞ্জস্যের একমাত্র সতর্কতা হ'ল আপনার প্রোগ্রামটি অবশ্যই libstdc++.soজিসিসি 7 (বা তার পরে) থেকে ভাগ করা লাইব্রেরিটি ব্যবহার করবে । যেহেতু অবজেক্ট এফটি জিসিসি with এর সাথে সংকলিত হয়েছিল, আপনাকে সেই রিলিজটি থেকে ভাগ করা লাইব্রেরিটি ব্যবহার করতে হবে, কারণ জিসিসি with এর সাথে প্রোগ্রামের কোনও অংশ সংকলন করা প্রতীকগুলির উপর নির্ভরশীলতার পরিচয় দিতে পারে যা libstdc++.soজিসিসি ৪.৯ বা জিসিসি ৫ থেকে উপস্থিত নেই । একইভাবে, আপনি যদি জিসিসি 8 এর সাথে নির্মিত জি অবজেক্টের সাথে লিঙ্ক করেন তবে জি libstdc++.soদ্বারা প্রয়োজনীয় সমস্ত প্রতীক পাওয়া গেছে তা নিশ্চিত করার জন্য আপনাকে জিসি 8 থেকে ব্যবহার করতে হবে। সহজ নিয়মটি হ'ল প্রোগ্রামটি রান-টাইমে ব্যবহার করা ভাগ করা লাইব্রেরিটি অন্তত কোনও অবজেক্টের সংকলন করার জন্য ব্যবহৃত সংস্করণ হিসাবে নতুন হিসাবে নিশ্চিত হওয়া উচিত।

আপনার প্রশ্নের মন্তব্যে ইতিমধ্যে উল্লিখিত জিসিসি ব্যবহার করার সময় আরেকটি সতর্কতা হ'ল জিসিসি 5 যেহেতু লিবস্টেডসি ++ এ দুটিstd::string উপলব্ধ বাস্তবায়ন রয়েছে । দুটি বাস্তবায়ন লিঙ্ক-সামঞ্জস্যপূর্ণ নয় (তাদের বিভিন্ন ম্যাংলেড নাম রয়েছে, তাই একত্রে সংযুক্ত করা যাবে না) তবে একই বাইনারিটিতে সহ-উপস্থিত থাকতে পারে (তাদের আলাদা ম্যাংলেড নাম রয়েছে, তাই কোনও বস্তু ব্যবহার করে std::stringএবং দ্বন্দ্ব করবেন না যদি অন্যান্য ব্যবহার std::__cxx11::string)। যদি আপনার অবজেক্টগুলি ব্যবহার করে std::stringতবে সাধারণত সেগুলি একই স্ট্রিং বাস্তবায়নের সাথে সংকলন করা উচিত। -D_GLIBCXX_USE_CXX11_ABI=0মূল gcc4-compatibleবাস্তবায়ন বা নতুনটি নির্বাচন -D_GLIBCXX_USE_CXX11_ABI=1করতে নির্বাচন করুনcxx11 বাস্তবায়ন (নাম দ্বারা বোকা বানানো যাবে না, এটা সি ব্যবহার করা যেতে পারে ++, 03 খুব, এটা বলা হচ্ছেcxx11কারণ এটি সি ++ 11 প্রয়োজনীয়তার সাথে সঙ্গতিপূর্ণ)। কোন বাস্তবায়ন ডিফল্ট তা জিসিসি কীভাবে কনফিগার করা হয়েছিল তার উপর নির্ভর করে, তবে ম্যাক্রোর সাথে সংকলন সময়ে ডিফল্টটি সর্বদা ওভাররাইড করা যায়।


"কারণ জিসিসি with এর সাথে প্রোগ্রামের কোনও অংশ সংকলন করার ফলে লিবিস্টডিসি ++ তে উপস্থিত প্রতীকগুলির উপর নির্ভরশীলতা প্রবর্তিত হতে পারে। সুতরাং জিসিসি ৪.৯ বা জিসিসি ৫ থেকে" আপনি বোঝাতে চেয়েছিলেন যে জিসিসি ৪.৯ বা জিসিসি ৫ থেকে উপস্থিত নেই, তাই না? এটি কি স্থির সংযোগের ক্ষেত্রেও প্রযোজ্য? সংকলক সংস্করণ জুড়ে সামঞ্জস্যের তথ্যের জন্য ধন্যবাদ।
হাদি ব্রেইস

4
আমি এই প্রশ্নের উপর অনুদান দেওয়ার ক্ষেত্রে একটি বিশাল ত্রুটিটি বুঝতে পেরেছি। 😂
অরবিট

4
@ricab আমি 90% নিশ্চিত উত্তরটি ক্ল্যাং / লিবিসি ++ এর জন্য একই, তবে আমার এমএসভিসি সম্পর্কে কোনও ধারণা নেই।
জোনাথন ওয়েকেলি

4
এই উত্তরটি স্টার্লার। এটি কি কোথাও নথিভুক্ত করা হয়েছে যে 5 / 5+ 11/14 এর জন্য স্থিতিশীল?
ব্যারি

4
খুব স্পষ্টভাবে বা এক জায়গায় নয়। gcc.gnu.org/gcc-5/changes.html#libstdcxx এবং gcc.gnu.org/onlinesocs/libstdc++/manual/api.html#api.rel_51 সি ++ 11 সম্পূর্ণ হওয়ার জন্য লাইব্রেরি সমর্থন ঘোষণা করুন (ভাষা সমর্থনটি বৈশিষ্ট্য-পূর্বে সম্পূর্ণ ছিল, তবে এখনও "পরীক্ষামূলক")। সি ++ ১৪ টি লাইব্রেরি সমর্থনটি এখনও পরীক্ষামূলক হিসাবে তালিকাভুক্ত হয়েছে ,.১ অবধি, তবে আমি মনে করি অনুশীলনে এবিআইকে প্রভাবিত করে 5.x এবং 6.x এর মধ্যে কিছুই পরিবর্তন হয়নি।
জোনাথন ওয়েকেলি

17

উত্তরের দুটি অংশ রয়েছে। সংযোগকারী স্তরে সামঞ্জস্যতা এবং লিঙ্কার স্তরে সামঞ্জস্য। প্রাক্তন দিয়ে শুরু করা যাক।

ধরা যাক সমস্ত শিরোনাম সি ++ 11-এ লেখা হয়েছিল

একই সংকলক ব্যবহারের অর্থ হ'ল লক্ষ্য সি ++ স্ট্যান্ডার্ড নির্বিশেষে একই স্ট্যান্ডার্ড লাইব্রেরির শিরোনাম এবং উত্স ফাইলগুলি (সংকলকের সাথে সম্পর্কিত অঙ্গেস) ব্যবহৃত হবে। অতএব, স্ট্যান্ডার্ড লাইব্রেরির হেডার ফাইলগুলি সংকলক দ্বারা সমর্থিত সমস্ত সি ++ সংস্করণের সাথে সামঞ্জস্যপূর্ণ হতে লেখা হয়।

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

এর সবকটির অর্থ হ'ল আপনার অনুমান কেবলমাত্র আপনার লেখা শিরোনাম ফাইলগুলিতে প্রয়োগ হতে পারে। যখন বিভিন্ন সি ++ স্ট্যান্ডার্ডকে লক্ষ্য করে বিভিন্ন অনুবাদ ইউনিটে অন্তর্ভুক্ত করা হয় তখন এই শিরোনাম ফাইলগুলি অসঙ্গতিগুলির কারণ হতে পারে। এটি সি ++ স্ট্যান্ডার্ডের এনেক্সেক্স সিটিতে আলোচনা করা হয়েছে। এখানে 4 টি ধারা রয়েছে, আমি কেবল প্রথমটিই আলোচনা করব এবং বাকী অংশটি সংক্ষেপে উল্লেখ করব।

C.3.1 ধারা 2: লিক্সিক কনভেনশনস

একক উদ্ধৃতিগুলি সি ++ 11-তে একটি অক্ষরকে আক্ষরিক আকারে সীমাবদ্ধ করে, যেখানে তারা সি ++ 14 এবং সি ++ 17 তে অঙ্ক বিভাজনকারী হয়। ধরে নিন আপনার খাঁটি সি ++ 11 শিরোনাম ফাইলগুলির মধ্যে একটিতে নিম্নলিখিত ম্যাক্রো সংজ্ঞা রয়েছে:

#define M(x, ...) __VA_ARGS__

// Maybe defined as a field in a template or a type.
int x[2] = { M(1'2,3'4) };

শিরোনাম ফাইল অন্তর্ভুক্ত দুটি অনুবাদ ইউনিট বিবেচনা করুন, কিন্তু যথাক্রমে সি ++ 11 এবং সি ++ 14 লক্ষ্য করুন। সি ++ ১১ টার্গেট করার সময়, উদ্ধৃতিগুলির মধ্যে থাকা কমাটিকে প্যারামিটার বিভাজক হিসাবে বিবেচনা করা হয় না; শুধুমাত্র একবার প্যারামিটার আছে। সুতরাং, কোডটি সমান হবে:

int x[2] = { 0 }; // C++11

অন্যদিকে, সি ++ 14 লক্ষ্য করার সময়, একক উদ্ধৃতিগুলি অঙ্ক বিভাজক হিসাবে ব্যাখ্যা করা হয়। সুতরাং, কোডটি সমান হবে:

int x[2] = { 34, 0 }; // C++14 and C++17

এখানে মূল বক্তব্যটি হ'ল খাঁটি সি ++ 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 বিভিন্ন অনুবাদ ইউনিটগুলি সংকলন করতে পারেন যা সি ++ স্ট্যান্ডার্ডের বিভিন্ন সংস্করণকে লক্ষ্য করে, যা খুব কমপক্ষে ডাব্লুপিও ভেঙে দেয়।

ক্যাভেট: আমার উত্তর সম্পূর্ণ বা খুব সুনির্দিষ্ট নাও হতে পারে।


প্রশ্নটি আসলে সংকলনের চেয়ে লিঙ্কিংয়ের বিষয়টিকে বোঝানো হয়েছিল। আমি স্বীকার করেছি ( এই মন্তব্যে ধন্যবাদ ) যা সম্ভবত পরিষ্কার ছিল না এবং এটি সম্পাদনা করে পরিষ্কার করে দিয়েছিলাম যে অন্তর্ভুক্ত শিরোনামগুলির তিনটি মানেরই একই ব্যাখ্যা রয়েছে।
রিস্যাব

@ricab উত্তরটি সংকলন এবং লিঙ্ক উভয়ই জুড়ে। আমি ভেবেছিলাম আপনি উভয়ের সম্পর্কে জিজ্ঞাসা করছেন।
হাদি ব্রেইস

4
প্রকৃতপক্ষে, তবে আমি উত্তরটি বেশ দীর্ঘ এবং বিভ্রান্ত বলে মনে করি, বিশেষত "এখন আমি লিঙ্কার স্তরে সামঞ্জস্য নিয়ে আলোচনা করব" অবধি। আপনি উপরের সমস্ত কিছু প্রতিস্থাপন করতে পারেন যেমন অন্তর্ভুক্ত শিরোনামগুলি সি ++ 11 এবং সি ++ 14/17 তে একই অর্থ রাখতে পোস্ট করা যায় না, তবে সেগুলি প্রথম স্থানে অন্তর্ভুক্ত করা নিরাপদ নয় । বাকি অংশের জন্য, আপনি কি এমন উত্স দেখিয়েছেন যে সেই তিনটি বুলেট পয়েন্টই কেবল অসঙ্গতির জন্য সম্ভাব্য কারণ? যে কোনও ক্ষেত্রে উত্তরের জন্য ধন্যবাদ, আমি এখনও ভোট দিয়ে যাচ্ছি
21

@ricab আমি নিশ্চিত করে বলতে পারি না। এজন্য আমি উত্তরটির শেষে ক্যাভ্যাটটি যুক্ত করেছি। উত্তরটি আরও সুনির্দিষ্ট করতে বা কোনও কিছু মিস করার ক্ষেত্রে সম্পূর্ণ করার জন্য অন্য যে কোনও ব্যক্তিকে স্বাগত জানাই।
হাদি ব্রেইস

এটি আমাকে বিভ্রান্ত করে: "একই সংকলকটি ব্যবহার করার অর্থ একই স্ট্যান্ডার্ড লাইব্রেরি শিরোনাম এবং উত্স ফাইল (...) ব্যবহৃত হবে"। কীভাবে তা হতে পারে? আমার যদি জিসিসি 5 এর সাথে পুরানো কোডটি সংকলিত থাকে তবে সেই সংস্করণটির সাথে সংযুক্ত 'সংকলক ফাইলগুলি' ভবিষ্যতের প্রমাণ হতে পারে না। বিভিন্ন সংকলক সংস্করণ সহ বিভিন্ন সময়ে (বন্যভাবে) সংকলিত উত্স কোডের জন্য আমরা গ্রন্থাগারের শিরোনাম এবং উত্স ফাইলগুলি আলাদা কিনা তা বেশ নিশ্চিত হতে পারি। আপনার নিয়মটি যে এগুলি একই হওয়া উচিত, আপনি gcc5 সহ পুরানো উত্স কোডটি পুনরায় সংকলন করতে হবে, ... এবং নিশ্চিত করুন যে তারা সকলেই সর্বশেষ (একই) 'সংকলক ফাইলগুলি' ব্যবহার করেছেন।
ব্যবহারকারী 2943111

2

নতুন সি ++ স্ট্যান্ডার্ড দুটি অংশে এসেছে: ভাষা বৈশিষ্ট্য এবং স্ট্যান্ডার্ড গ্রন্থাগার উপাদান।

আপনি যেমন নতুন স্ট্যান্ডার্ড বলতে চাইছেন তেমনি ভাষাতেও পরিবর্তন (যেমন রেঞ্জড ফোর) প্রায় কোনও সমস্যা নেই (কখনও কখনও তৃতীয় পক্ষের লাইব্রেরি শিরোনামে নতুন স্ট্যান্ডার্ড ভাষার বৈশিষ্ট্যগুলি সহ বিরোধগুলি উপস্থিত থাকে)।

তবে স্ট্যান্ডার্ড লাইব্রেরি ...

প্রতিটি সংকলক সংস্করণ সি ++ স্ট্যান্ডার্ড লাইব্রেরি (জিসিসি সহ লাইবস্টিডি ++, ক্ল্যাং সহ লাইবসি ++, ভিসি ++ সহ এমএস সি ++ স্ট্যান্ডার্ড লাইব্রেরি, ...) এবং প্রতিটি স্ট্যান্ডার্ড সংস্করণের জন্য একাধিক বাস্তবায়ন নয়। এছাড়াও কিছু ক্ষেত্রে আপনি সংকলক সরবরাহকারীর চেয়ে স্ট্যান্ডার্ড লাইব্রেরির অন্যান্য প্রয়োগ ব্যবহার করতে পারেন। আপনার যা যত্ন করা উচিত তা হ'ল একটি পুরানো স্ট্যান্ডার্ড লাইব্রেরি বাস্তবায়নটিকে একটি নতুনের সাথে সংযুক্ত করে।

তৃতীয় পক্ষের লাইব্রেরি এবং আপনার কোডের মধ্যে যে দ্বন্দ্ব দেখা দিতে পারে তা হ'ল স্ট্যান্ডার্ড লাইব্রেরি (এবং অন্যান্য লাইব্রেরি) যা 3rd য় পক্ষের লাইব্রেরিতে লিঙ্ক করে।


"প্রতিটি সংকলক সংস্করণ এসটিএল বাস্তবায়নের সাথে আসে" না তারা করেন না
অরবিট

@ লাইটনেসেসেসিনঅরবিট আপনি কি বোঝাতে চেয়েছেন যে লিবস্টেডিসি ++ এবং জিসিসি-র মধ্যে কোনও বিরোধ নেই?
E. ভাকিলি

9
না, আমার অর্থ এসটিএল কার্যকরভাবে বিশ বছরেরও বেশি সময় ধরে অপ্রচলিত। আপনি সি ++ স্ট্যান্ডার্ড লাইব্রেরি বোঝাতে চেয়েছিলেন। বাকি উত্তর হিসাবে, আপনি কি আপনার দাবিটি ব্যাক আপ করার জন্য কিছু তথ্যসূত্র / প্রমাণ সরবরাহ করতে পারেন? আমি মনে করি এটি একটি প্রশ্নের জন্য এটি গুরুত্বপূর্ণ।
অরবিট

4
দুঃখিত, না, এটি পাঠ্য থেকে পরিষ্কার নয়। আপনি কিছু আকর্ষণীয় জোর দিয়েছিলেন, তবে কোনও প্রমাণ সহ তাদের এখনও ব্যাক আপ করেন নি।
অরবিট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.