সি ++ এ "ব্যবহার" ঘোষণার সুযোগ কী?


101

স্থানীয় নামস্থানে (std :: 's টাইপিং অকারণে সংরক্ষণ করতে) std :: স্ট্রিং এবং std :: ভেক্টর যুক্ত করতে আমি সি ++ তে' ব্যবহার 'ঘোষণা ব্যবহার করছি।

using std::string;
using std::vector;

class Foo { /*...*/ };

এই ঘোষণার সুযোগ কী? যদি আমি এটি একটি শিরোনামে করি তবে এটি শিরোনামটি অন্তর্ভুক্ত করে প্রতিটি সিপিপি ফাইলের মধ্যে এইগুলি 'ব্যবহার করে' ঘোষণাগুলি ইনজেকশন দেবে?


18
এখানে অন্য উত্তরগুলি থেকে এটি পরিষ্কার নয়: - ফাইল স্কোরের কোনও ফাইল / শিরোলেখগুলিতে কোনও usingঘোষণা (বা usingনির্দেশিকা) রাখবেন না! এটি হেডার ব্যবহারকারীদের জন্য মাথাব্যথা সৃষ্টি করবে।
মাইকেল বুড় 19

আসলে, একটি রাখি না usingঘোষণা (ক কঠিনতর যুক্তিসহকারে নির্দেশ একটি শিরোলেখ মধ্যে) এ সব , এমনকি একটি নামস্থান মধ্যে! এই কারণগুলির সমস্যার জন্য একটি নেমস্পেসের মধ্যে ঘোষণা ব্যবহারের সুযোগ দেখুন ।
নীল ভন বার্থ

@ নীলসভন বার্থ: এটি কিছুটা প্রশমিত হয়েছে। usingক্লাস এবং ফাংশন স্কোপ ব্যবহার করা আলোচিত সমস্যা সম্পর্কিত নিরাপদ।
সেবাস্তিয়ান মাচ


আপনি এডিএল সি ++ দেখার বৈশিষ্ট্যটি পড়তে আগ্রহী হতে পারেন ।
অ্যালেক্সিস উইলক

উত্তর:


61

আপনি যখন সি ++ তে একটি শিরোনাম ফাইল অন্তর্ভুক্ত করেন, এটি হেডার ফাইলের পুরো বিষয়বস্তুটিকে উত্স ফাইলে অন্তর্ভুক্ত করে the সুতরাং একটি ফাইল রয়েছে যার মধ্যে একটি usingঘোষণাপত্র রয়েছে তা usingপ্রতিটি ফাইলের শীর্ষে ঘোষণাটি রাখার ঠিক একই প্রভাব ফেলে যার মধ্যে সেই শিরোনাম ফাইল অন্তর্ভুক্ত থাকে।


54
... যা সাধারণত খারাপ জিনিস।
ক্যাটসকুল

17
তবে আপনি যদি কোনও usingঘোষণার ভিতরে namespaceএটি রাখেন তবে এটি কেবলমাত্র সেই নামস্থানের সুযোগের মধ্যে সীমাবদ্ধ রয়েছে, তাই সাধারণত ঠিক আছে (আপনার নির্দিষ্ট প্রয়োজন এবং শৈলীতে স্বাভাবিক সতর্কতা সহ)।
জিরো

4
... তবে আপনি যদি কোনও নেমস্পেসের অভ্যন্তরে ব্যবহার করে থাকেন তবে নিশ্চিত হন যে আপনি এমন কোনও কিছু ঘুরিয়ে নেওয়ার চেষ্টা করছেন যা সাধারণত খারাপ ধারণা হয় না, যেমন আপনি অন্যের ভিতরে নেমস্পেসের ওয়াইয়ের বাইরে ঘোষিত শ্রেণি পদ্ধতিগুলিকে আবদ্ধ করতে পারবেন না like নেমস্পেস এক্স, ঠিক তেমনি আপনি স্থানীয়ভাবে নেমস্পেস এক্স ব্যবহার করতে পারেন Tha আমাদের কেন প্রথম স্থানটিতে নেমস্পেস :: রেজোলভার ব্যবহার করা উচিত ts টাইপিংয়ের ক্ষেত্রে যদি এটির সমস্যাটি হয় তবে ম্যাক্রো (যা সহজেই কোডের গন্ধ পেতে পারে) বা আরও ভাল, এটির নিজস্ব উত্সে বিচ্ছিন্ন করুন c যেখানে আপনি কেবলমাত্র নামস্থানটি ব্যবহার করবেন।
ওসিরিগোথর

4
যদিও এই এবং অনুরূপ উত্তরগুলি ভাল পরামর্শ, তারা প্রশ্নের উত্তর দেয় না।
এমিল কর্মিয়ার

116

শিরোনামের ফাইলগুলির বিষয়ে বিশেষ কিছু নেই যা এই usingঘোষণাটি বাইরে রাখবে । সংকলন এমনকি শুরুর আগে এটি একটি সাধারণ পাঠ্য প্রতিস্থাপন।

আপনি কোনও usingঘোষণাকে একটি সুযোগে সীমাবদ্ধ করতে পারেন :

void myFunction()
{
   using namespace std; // only applies to the function's scope
   vector<int> myVector;
}

12
আমি কখনই ভাবিনি যে আমি এটি কোনও ফাংশনের ভিতরে ব্যবহার করতে পারি!
অ্যাগোস্টিনো

4
আমার কাছে একগুচ্ছ নেমস্পেস রয়েছে যা সমস্ত একটি "কংগলমেটর"-টাইপ ফাইল দ্বারা ব্যবহৃত হচ্ছে, এবং জিএমক ইউনিট-পরীক্ষা অতিরিক্ত ক্লান্তিকর কারণ প্রতিটি পরীক্ষায় একটি নির্দিষ্ট নেমস্পেস থেকে জিনিস ব্যবহার করা হত, এবং আমি ভেবেছিলাম আমার প্রতিটি পরিবর্তনশীল যোগ্যতা অর্জন করতে হবে। ব্যবহার usingএকটি ফাংশন ভিতরে (বা এমনকি একটি gtest TESTম্যাক্রো!) তাই অনেক ভালো আমার জীবনের করে তোলে!
ডোয়ান্ডারসন

56

ব্যবহারের বিবৃতিটির সুযোগটি কোডটিতে কোথায় রয়েছে তার উপর নির্ভর করে:

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

6
আমি ভেবেছিলাম usingশ্রেণীর ক্ষেত্রের মধ্যে কোনও বিবৃতি যুক্ত করা সম্ভব নয় ...? আমার ওপি হিসাবে একই প্রশ্ন ছিল কারণ আমি std::পুরো জায়গাতেই টাইপ করা এড়াতে চেয়েছিলাম । আমি এমন ক্লাস পেয়েছি যা স্মার্ট পয়েন্টার সহ প্রচুর ভেক্টর ব্যবহার করে এবং পাঁচটি চরিত্রের std::উপসর্গটি অনেকগুলি লাইনের দৈর্ঘ্য যোগ করে - যা আমার মনে হয় আরও খারাপ পড়ে। সুতরাং আমি ভাবছিলাম usingযে ক্লাসটি সহ নেমস্পেসের মধ্যে কোনও নির্দেশিকা ঠিক আছে কিনা? (এমনকি যদি কোনও শিরোনামের মধ্যে থাকে।)
থমথম

5
যদি এটি একটি এর আওতা মধ্যে স্থাপন করা হয় namespace { ... }?
einpoklum

সুতরাং আপনি সম্পূর্ণ লিখতে পারেন: name নেমস্পেস ব্লেব্লা ব্যবহার করে; ক্লাস ব্লাহ {}; using এবং এটি ব্যবহার করে কেবল ক্লাসের জন্য প্রযোজ্য হবে?
দিনাইজ

8

স্কোপটি হ'ল ব্যবহারের ঘোষণায় যে পরিমাণ সুযোগ রয়েছে।

এটি যদি বিশ্বব্যাপী সুযোগ হয় তবে তা বিশ্বব্যাপী সুযোগে থাকবে। যদি এটি কোনও শিরোনাম ফাইলের বিশ্বব্যাপী স্কোপে থাকে তবে তা শিরোনামের অন্তর্ভুক্ত প্রতিটি উত্স ফাইলের বৈশ্বিক স্কোপে থাকবে।

সুতরাং, সাধারণ পরামর্শ হ'ল হেডার ফাইলগুলির বিশ্বব্যাপী ঘোষণাপত্র ব্যবহার করা এড়ানো


4
এটি যথেষ্ট শক্তিশালী নয়। এর সাথে এড়ানো প্রতিস্থাপন করুন
মার্টিন ইয়র্ক

4
তবে এড়ানো আরও শক্তিশালী নয়। "অন্যান্য গাড়িগুলিকে আঘাত করা থেকে
বিরত থাকুন

6

ক্ষেত্রে উল্লেখ করা হয়েছে, ফাইলটি ("অনুবাদ ইউনিট"), যার অর্থ হ্যাঁ, এটি অন্তর্ভুক্ত প্রতিটি ফাইল।

আপনি ক্লাসের অভ্যন্তরে ইউজিং স্টেটমেন্টটিও রাখতে পারেন, সেক্ষেত্রে এটি কার্যকর হয় কেবল সেই শ্রেণীর জন্য।

সাধারণত, যদি আপনাকে একটি শিরোনামে একটি নেমস্পেস নির্দিষ্ট করতে হয়, তবে প্রয়োজনীয় প্রতিটি শনাক্তকারীকে পুরোপুরি যোগ্যতা অর্জন করা সবচেয়ে ভাল।


নোট করুন যে usingক্লাসে ঘোষণাটি কোনও শ্রেণীর বাইরে যেমন আচরণ করে না - যেমন আপনি এটি শ্রেণীর ক্ষেত্রের coutপরিবর্তে আনতে পারেন না use std::cout
জিরো

2

ঐটা ঠিক. সুযোগ হ'ল মডিউল যা usingঘোষণাটি ব্যবহার করে । কোনও মডিউল অন্তর্ভুক্ত যে কোনও শিরোলেখের ফাইলগুলির usingডিক্লারেশন রয়েছে , সেই ঘোষণাগুলির ব্যাপ্তি হবে সেই মডিউল এবং সেই সাথে অন্য কোনও মডিউল যা একই শিরোনামকে অন্তর্ভুক্ত করে।


1

কিছু মন্তব্য রয়েছে যেগুলি "না" বললে বরং অযোগ্য হয়ে যায়। এটি খুব কঠোর, তবে কখন ঠিক আছে তা আপনাকে বুঝতে হবে।

লেখা using std::stringকখনই ঠিক হয় না OK using ImplementationDetail::Fooআপনার নিজের শিরোনামে লেখার সময়, যখন সেই শিরোনাম ইমপ্লিমেন্টেশন ডেটেল ঘোষণা করে: Foo ঠিক আছে, অন্যথায় যদি ব্যবহারের ঘোষণাটি আপনার নামস্থানে ঘটে। যেমন

namespace MyNS {
    namespace ImplementationDetail {
        int Foo;
    }
    using ImplementationDetail::Foo;
}

4
এরপরে MyNS::Foo
শিরোনামটির

এর চেয়ে ভালো উদাহরণ হ'ল using boost::posix_time::ptime। নিশ্চিত যে ব্যবহারকারী লিখতে পারে MyNS::ptimeতবে এটি পৃথিবীর শেষ নয়, এবং এর মতো ফাংশন রাখতে সক্ষম হওয়ার সুবিধার্থে অফসেট হতে পারে MyFunction(ptime a, ptime b)
জিরো

5
কেন হয় using std::stringনা ঠিক আছে? এমনকি আপনার নিজের নামের std::জায়গাতেও প্রচুর উপসর্গ সংরক্ষণ করতে চান ?
থমথম

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