কোন হেডার ফাইলগুলি অন্তর্ভুক্ত করবেন তা কীভাবে নির্ধারণ করবেন?


13

বলুন আমার নীচের (খুব সাধারণ) কোড রয়েছে।

#include <iostream>
int main() {
    std::cout << std::stoi("12");
}

এটি জি ++ এবং ঝনঝন উভয় ক্ষেত্রেই সূক্ষ্ম সংকলন করে; তবে, এটি নিম্নলিখিত ত্রুটির সাথে এমএসভিসিতে সংকলন করতে ব্যর্থ হয়েছে:

ত্রুটি C2039: 'স্টোই': 'স্টাডি' এর সদস্য নয়

ত্রুটি C3861: 'স্টোই': সনাক্তকারী পাওয়া যায় নি

আমি জানি যে std::stoiএটি <string>শিরোলেখের অংশ , যা সম্ভবত দু'জন প্রাক্তন সংকলক অংশ হিসাবে অন্তর্ভুক্ত করেছে <iostream>এবং পরবর্তীটি তা নয়। সি ++ স্ট্যান্ডার্ড অনুসারে [রেস.অন.হ্যাডারস]

একটি সি ++ শিরোনামে অন্যান্য সি ++ শিরোনাম অন্তর্ভুক্ত থাকতে পারে।

যা আমার কাছে, মূলত বলে যে তিনটি সংকলকই সঠিক।

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

আমি ভাবতে পারি একমাত্র উপায় হ'ল এটি নিশ্চিত করা যে প্রতিটি stdফাংশন কলের জন্য একটি উপযুক্ত অন্তর্ভুক্ত থাকে; তবে আপনার যদি বিদ্যমান কোড রয়েছে যা কয়েক হাজার লাইনের দীর্ঘ, এটি অনুসন্ধান করা ক্লান্তিকর হতে পারে। ক্রস সংকলক সামঞ্জস্যতা নিশ্চিত করার একটি সহজ / আরও ভাল উপায় আছে?

তিনটি সংকলক সহ উদাহরণ: https://godbolt.org/z/kJhS6U


6
যদি আপনি মনে করেন যে স্ট্রিংstd::stoi পরিচালনা করার জন্য এটি আপনি অনুমান করতে পারেন যে এটি অন্তর্ভুক্ত করা ভাল শিরোনাম হবে। অথবা আপনি একটি ভাল রেফারেন্স অনুসন্ধান করতে পারেন যা আপনাকে জানাবে। এবং আমি আপনাকে সুপারিশ করি যে আপনি সর্বদা স্পষ্টভাবে শিরোলেখ ফাইলগুলিকে অন্তর্ভুক্ত করুন, সুতরাং আপনাকে পোর্টেবল অযোগ্য প্রয়োগের নির্দিষ্ট আচরণের উপর নির্ভর করতে হবে না। <string>
কিছু প্রোগ্রামার ডুড

3
সর্বোত্তম উপায় হ'ল অন্য কোনও প্ল্যাটফর্মে যাওয়ার আগে সিপ্রেফারেন্সে যাওয়া। তাদের কাছে সেখানে বেশ বিশদ বিবরণ রয়েছে।
সিদ্ধার্থ

1
আপনি কোডটি লেখার মুহুর্তে উপযুক্ত শিরোনাম অন্তর্ভুক্ত করুন। অর্থাৎ। আপনি যে কোডটি লিখেছেন সেই মুহুর্তে std::stoi, আপনি তাত্ক্ষণিকভাবে নিশ্চিত হয়ে গেছেন যে #include <string>উপস্থিত রয়েছে।
Sander De Dycker

3
সাধারণ ক্ষেত্রে এটি একটি কঠিন সমস্যা । তবে, যখন আমরা নিখোঁজ স্ট্যান্ডার্ড লাইব্রেরি সম্পর্কে কথা বলছি তখন স্বাভাবিক উপায়টি হ'ল ব্যবহৃত ফাংশন কল / প্রকারগুলি পরীক্ষা করা examine
ম্যাক্স ল্যাংফোফ

1
@ skratchi.at, শিক্ষার্থীদের বলা হয় যে তারা যেকোন সংকলক তারা ব্যবহার করতে পারে, যতক্ষণ না তাদের কোড মানসম্মত হয়। 4 বছর পরে, এটিই প্রথমবারের মতো কোনও সমস্যা হয়ে দাঁড়িয়েছে।
ক্রিসএমএম

উত্তর:


14

ক্রস সংকলক সামঞ্জস্যতা নিশ্চিত করার একটি সহজ / আরও ভাল উপায় আছে?

আপনার যদি একটি বিশাল কোডবেস থাকে এবং এখনও অবধি এটি না করে থাকেন তবে এটি সর্বদা কিছুটা নিয়মিত কাজ হতে চলেছে তবে আপনি যখন নিজের অন্তর্ভুক্তটি ঠিক করে ফেলেছেন তবে আপনি একটি সাধারণ পদ্ধতিতে আটকে থাকতে পারেন:

আপনি যখন কোনও নতুন কোড লিখেন যা একটি মানক বৈশিষ্ট্য ব্যবহার করে, যেমন std::stoi, সেই নামটি গুগলে প্লাগ করে, এর জন্য সিপ্রেফারেন্স.কম নিবন্ধে যান, তারপরে কোন শিরোনামটি সংজ্ঞায়িত হয়েছে তা দেখতে শীর্ষের দিকে তাকান।

তারপরে এটি অন্তর্ভুক্ত করুন, যদি এটি ইতিমধ্যে অন্তর্ভুক্ত না থাকে। কাজ শেষ!

(আপনি এটির জন্য স্ট্যান্ডার্ডটি ব্যবহার করতে পারেন তবে এটি অ্যাক্সেসযোগ্য নয়))

এটা বরখাস্ত করতে প্রলুব্ধ হবেন না পক্ষে সব বন্ধ সস্তা, unportable হ্যাক পছন্দ <bits/stdc++.h>!


tl; dr: ডকুমেন্টেশন


3
ন্যায়সঙ্গত হওয়ার জন্য, একবার আপনি কার্যকরভাবে এগুলি সমস্ত মুখস্ত করে
নিয়েছেন

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

1
@ জোসেফউডের মতো, আমিও আশা করছিলাম যে আরও অভিজ্ঞতার সাথে আরও ভাল উপায় আছে। আমি জানি যে বেশিরভাগ এসটিএল ফাংশনগুলির জন্য কোন শিরোনামগুলি অন্তর্ভুক্ত করবে, তবে আশা ছিল যে প্রতিটি ফাংশন
সন্ধানের

1
@ ক্রিসিএমএম-তে এমন কিছু সরঞ্জাম রয়েছে যা অন্তর্ভুক্ত-কী-আপনি ব্যবহার করেন । তাদের নির্ভুলতার গ্যারান্টি দেওয়া যায় না (এবং সত্যই মাঝে মধ্যে ম্যানুয়াল কাজ করা প্রয়োজন) তবে এটি মোটেও খারাপ নয়।
freakish

4
@ ক্রিসমিম আপনার শিক্ষার্থীদের ডকুমেন্টেশন উল্লেখ করতে শেখানো অবিশ্বাস্যরূপে, অবিশ্বাস্যরূপে গুরুত্বপূর্ণ । হাজার হাজার মানুষ এই সাইটের উপর প্রতিদিনই প্রবাহিত করে যে কোনও পার্থিব ধারণা নেই যে তাদের এটি করা উচিত। ডকুমেন্টেশন ব্যবহার হয় সহজ / ভাল উপায়।
লাইটনেস রেস

-1

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

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

অথবা আপনি ক্লিওন (সমস্ত প্ল্যাটফর্মের জন্য উপলভ্য) ব্যবহার করতে পারেন যার মধ্যে এই ক্ষমতাও রয়েছে (আসলে এটি একই উত্পাদন জেটব্রেইনস)।

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


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