সি ++ এ সি শিরোনামগুলি ব্যবহার করার সময়, আমাদের কী স্টাড :: বা বিশ্বব্যাপী নেমস্পেস থেকে ফাংশন ব্যবহার করা উচিত?


113

সি কিছুটা, ঠিক নয়, সি ++ এর একটি উপসেট। সুতরাং আমরা সি ++ তে বেশিরভাগ সি ফাংশন / শিরোনাম ব্যবহার করতে পারি নামটি কিছুটা পরিবর্তন করে ( stdio.hথেকে cstdio, stdlib.hতে cstdlib)।

আমার প্রশ্ন আসলে একধরনের শব্দার্থক। সি ++ কোডে (জিসিসি কম্পাইলার এর সবচেয়ে নতুন সংস্করণ ব্যবহার), আমি কল করতে পারেন printf("Hello world!");এবং std::printf("Hello world!");এবং এটি ঠিক একই কাজ করে। এবং রেফারেন্সে আমি এটি ব্যবহার করছি হিসাবে প্রদর্শিত হবে std::printf("Hello world!");

আমার প্রশ্নটি হ'ল এটি কি std::printf();সি ++ এ ব্যবহার করা পছন্দ ? পার্থক্য আছে কি?


17
ঘটনা একদিন তারা ডাম্পিং জনাদেশ যে Cবিশ্বব্যাপী নামস্থান মধ্যে গ্রন্থাগার প্রতীক অবৈধ আমি ব্যবহার পছন্দ হতে std::যোগ্যতা সংস্করণ। (প্লাস আমি এক ধরণের ইচ্ছা তারা এটিকে অবৈধ করে তুলেছিল)।
গালিক

3
@ গালিক: একমত এটি সি ++ সংকলক ব্যবহার করে সি ইস্যুগুলি সম্পর্কে প্রচুর বোকা প্রশ্নগুলি নিরাপদ করবে।
এই সাইটের জন্য খুব সৎ

7
"কিছুটা গর্ভবতী" নেই। হয় সি একটি উপসেট, বা এটি হয় না। ঘটনাটি হ'ল, তা নয় । এই কারণেই সি ++ এ কাজ করতে সি শিরোনামগুলিকে সংশোধন করতে হবে।
এই সাইটের জন্য খুব সৎ

2
"প্রায় সবগুলি" হ'ল একটি অসাধারণ মাপকাঠি unc একই যুক্তি দ্বারা আপনি সম্ভবত সি এবং জাভা সম্পর্কিত হতে পারে।
ড্যানিয়েল জোর

9
@ সাসাউকে না, এটি কোনও উপসেট নয়। সি এবং সি ++ অবশ্যই একটি সাবসেট ভাগ করে , তবে সি নিজেই সি ++ এর উপসেট নয়
প্যারাম্যাগনেটিক ক্রোস্যান্ট

উত্তর:


106

সি ++ 11 স্ট্যান্ডার্ড (জোর দেওয়া খনি) থেকে:

D.5 সি স্ট্যান্ডার্ড লাইব্রেরি শিরোনাম [depr.c. Headers]

  1. সি স্ট্যান্ডার্ড লাইব্রেরির সাথে সামঞ্জস্যের জন্য ...
  2. প্রতিটি সি শিরোনাম, যার প্রত্যেকটিরই ফর্মের নাম .11 এর একটি নাম রয়েছে , এমন আচরণ করে যেন প্রমিত লাইব্রেরির নেমস্পেসে সংশ্লিষ্ট নামের শিরোনাম দ্বারা স্থান দেওয়া প্রতিটি নাম বিশ্বব্যাপী নেমস্পেসের ক্ষেত্রের মধ্যে স্থাপন করা হয় । এটা অনির্দিষ্ট কিনা এই নামগুলি প্রথম ঘোষিত বা নামস্থান সুযোগ মধ্যে সংজ্ঞায়িত করা হয় (3.3.6) এর নামস্থান এসটিডি এবং তারপর স্পষ্ট ব্যবহার-ঘোষণা (7.3.3) দ্বারা বিশ্বব্যাপী নামস্থান সুযোগ মধ্যে ইনজেকশনের হয়।
  3. উদাহরণ: শিরোনাম <cstdlib> নিশ্চিতরূপে নামের জায়গার মধ্যেstd এর ঘোষণা এবং সংজ্ঞা সরবরাহ করে । এটি বিশ্বব্যাপী নেমস্পেসের মধ্যে এই নামগুলি সরবরাহ করতে পারে। শিরোনাম <stdlib.h> নিশ্চিতভাবে গ্লোবাল নেমস্পেসের মধ্যে একই ঘোষণা এবং সংজ্ঞা প্রদান করে , অনেকটা সি স্ট্যান্ডার্ডের মতো। এটি নামের জায়গার মধ্যেও এই নামগুলি সরবরাহ করতে পারে std

«Name.h» শিরোনামগুলি ব্যবহার করা হ্রাস করা হয়েছে, এগুলি ভবিষ্যতের সংশোধন থেকে অপসারণের জন্য প্রার্থী হিসাবে চিহ্নিত হয়েছে।

সুতরাং, আমি «cname» শিরোনাম অন্তর্ভুক্ত করার এবং stdনেমস্পেস থেকে ঘোষণা এবং সংজ্ঞা ব্যবহার করার পরামর্শ দেব ।

যদি আপনাকে কিছু কারণে «name.h» শিরোনাম ব্যবহার করতে হয় (এটি অবহেলা করা হয়েছে, উপরে দেখুন), আমি বিশ্বব্যাপী নেমস্পেস থেকে ঘোষণা এবং সংজ্ঞা ব্যবহার করার পরামর্শ দেব would

অন্য কথায়: পছন্দ করুন

#include <cstdio>

int main() {
    std::printf("Hello world\n");
}

উপর

#include <stdio.h>

int main() {
    printf("Hello world\n");
}

1
N3242 কোনও সি ++ মানক নয়। সি ++ 11 থেকে স্বল্পতম পার্থক্য সহ খসড়াটি N3337।
এমএম

3
এছাড়াও জোনাথন ভেকলির কেন <সিএসটিডলিব> রেড টুপি ব্লগগুলি থেকে আপনি ভাবেন তার চেয়ে বেশি জটিল তা দেখুন । তিনি সি ++ স্ট্যান্ডার্ড লাইব্রেরি প্রয়োগকারীদের দৃষ্টিকোণ থেকে বেশ কয়েকটি সমস্যার বিবরণ দেন। তিনি সি ++ 98 তে ফিরে যাওয়ার ইতিহাসও সরবরাহ করেন।
jww

@ সেরজজ - আপনি কি এই বিষয়ে C ++ 03 চিকিত্সা সম্পর্কে জানবেন? নাকি এটি হিট হয়েছে বা মিস হবে কি হবে?
jww

5
<name.h> অবহেলিত হতে পারে, এগুলি যে কোনও সময় শীঘ্রই সরিয়ে ফেলার কোনও সম্ভাবনা নেই। প্রকৃতপক্ষে, পুরোপুরি বিপরীত। অবহেলিত লেবেলটি অপসারণ করার প্রস্তাব রয়েছে, ওপেন-স্টাড.অর্গ.ও / জেটিসি / এসসি 22/WG21/docs/papers/2017/p0619r0.html#3.5 দেখুন"পরিশেষে, এটি স্পষ্ট বলে মনে হয় যে সি হেডসগুলি সি এবং পসিক্সের সাথে একটি অত্যাবশ্যকীয় সামঞ্জস্য স্তর হিসাবে মূল চিরকালের জন্য বজায় রাখা হবে head এটি শিরোনামকে অবমূল্যায়ন করার উপযুক্ত হতে পারে, [..]"
স্যাজার্ড

81

<cmeow>সর্বদা সরবরাহ করে ::std::purrএবং নাও সরবরাহ করতে পারে ::purr

<meow.h>সর্বদা সরবরাহ করে ::purrএবং নাও সরবরাহ করতে পারে ::std::purr

আপনার অন্তর্ভুক্ত শিরোনাম দ্বারা সরবরাহের গ্যারান্টিযুক্ত ফর্মটি ব্যবহার করুন।


7
এসটিএল খারাপ ছদ্মবেশে?
nwp

@Nwp না (15 অক্ষর)
টিসি

@ টিটিসি দুর্ভাগ্যক্রমে, আমি আমার সংকলকটিতে চেষ্টা করেছিলাম, না পূর্বতর প্রসেসরের ত্রুটি বা <cmeow>নাই <meow.h>সরবরাহ করে না । কেবলমাত্র এবং / অথবা সরবরাহ করে এবং / অথবা । : পি::std::purr::purr<cstdio><stdio.h>::std::printf::printf
এলএফ

4
@ এলএফ আপনার strcatউত্পাদন প্রয়োজন হতে পারে ::purr
লন্ডিন

8

না, আপনি যেভাবেই ভাল আছেন।

মূল অভিপ্রায় ছিল যে <___.h>হেডার সি সংস্করণ যা বিশ্বব্যাপী নামস্থান সবকিছু করা হবে এবং <c___>হেডার সি ++ হবে - ified সংস্করণ, যা জায়গায় সবকিছু stdনামস্থান।

বাস্তবে, যদিও, সি ++ সংস্করণ এছাড়াও সবকিছু বিশ্বব্যাপী নামস্থান পুরা। এবং std::সংস্করণগুলি ব্যবহার করা "করণীয় সঠিক জিনিস" এটি সম্পর্কে কোনও স্পষ্ট conকমত্য নেই ।

সুতরাং মূলত, আপনি যেটিকে পছন্দ করুন ব্যবহার করুন। সর্বাধিক সাধারণ হ'ল গ্লোবাল নেমস্পেসে ( printfপরিবর্তে std::printf) সি স্ট্যান্ডার্ড লাইব্রেরি ফাংশনগুলি ব্যবহার করা , তবে একজনকে অন্যটির চেয়ে "ভাল" বিবেচনা করার খুব বেশি কারণ নেই।


2
"এবং স্ট্যান্ড :: সংস্করণ ব্যবহার করা" করণীয় সঠিক জিনিস "এটি সম্পর্কে কোনও স্পষ্ট conক্যমত নেই।" আহ, হ্যাঁ সেখানে সম্পূর্ণরূপে sensকমত্য রয়েছে যে এটি করা সঠিক কাজ।
মাইলস রাউট

4
Oneক্যমত্য হয়েছে কি না তা কীভাবে একজন অবজেক্টিভভাবে নির্ধারণ করে?
জেরেমি ফ্রাইজনার

9
@ জেরেমিফ্রিজনার আপনি এটি সম্পর্কে পোস্ট করেন এবং দেখুন আপনি মতবিরোধমূলক মন্তব্য পেয়েছেন কিনা। :)
জলফ

1
@ জেরেমিফ্রিজনার: মানটি সি ++ শিরোনামের সংস্করণগুলিকে গ্লোবাল নেমস্পেসে শনাক্তকারীদের রাখার গ্যারান্টি দেয় না। মানটি সি শিরোনামের সংস্করণগুলিকেও হ্রাস করে। এটি আমার কাছে বেশ sensকমত্য বলে মনে হচ্ছে। ;-)
দেবসোলার

2
@ ডেভসোলার একটি অভিধানে "sensকমত্য" শব্দটি দেখুন। এটি স্ট্যান্ডার্ড কী বলে তা নয়, তবে সি ++ প্রোগ্রামাররা কী বলে - এবং বিশেষত, তারা কী করে । আক্ষরিক অর্থে প্রতিটি মানক গ্রন্থাগার বাস্তবায়ন সি শিরোনাম সরবরাহ করে এবং সি ++ শিরোনামকে বিশ্বব্যাপী নেমস্পেসে সবকিছু রেখে দেয় এমন একটি কারণ রয়েছে। :)
জলফ

3

শুধু পার্থক্য নেই হয় std::printf()যোগ করে std::সুযোগ রেজল্যুশন আপনি কাউকে ভবিষ্যতে একই নাম, যা নামস্থান সংঘাতের নেতৃত্ব দিয়ে একটি ফাংশন লেখা থেকে নিজেকে নিরাপদ হবে। উভয় ব্যবহারের ফলে একই ওএস এপিআই কল আসবে (আপনি এটি চালিয়ে লিনাক্সের অধীনে চেক করতে পারেন strace your_program)।

আমি খুব অসম্ভব বলে মনে করি যে কেউ তার মতো কোনও ফাংশনের নাম রাখবেন, যেমনটি printf()সেখানে সর্বাধিক ব্যবহৃত ফাংশনগুলির মধ্যে একটি। এছাড়াও, সি ++ এ, iostreamপ্রিন্টফের cstdioমতো ফাংশনগুলিতে কলগুলির উপর প্রিফার করা হয় ।


1
বিপরীতে, আমি এটি বেশিরভাগ ক্ষেত্রেই পেয়েছি: printfদৃ strong় টাইপিংয়ের অভাবের কারণে সি ++ তে খুব খারাপভাবে ভেঙে গেছে, আরও ভাল সংস্করণ দিয়ে এটি প্রতিস্থাপন করা বেশ স্বাভাবিক।
কনরাড রুডলফ

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

1
@ অ্যালিস উহম, আমি কোনও চুক্তি ভঙ্গ করছি না: এর std::printfচেয়ে আলাদা mynamespace::printfএবং সি ++ স্পষ্টতই আমাকে আমার নিজের ফাংশনগুলি সংজ্ঞায়িত করতে অনুমতি দেয় যার নামগুলি ভেতরের কার্যাবলী থেকে ছায়া দেয় std। এটি কেবল বিতর্কযোগ্য নয়। আপনার দাবি হিসাবে যে printfআলগা টাইপিং কারণ দক্ষ, এটি অবশ্যই ভুল। printfএমনকি দক্ষ নয়, আরও অনেক কার্যকর বাস্তবায়ন রয়েছে যা দৃ strongly়ভাবে টাইপ করা হয়।
কনরাড রুডল্ফ

@ কনরাডরুডল্ফ একেবারে ভুল; আপনি স্ট্যান্ডার্ডে লেখা চুক্তিটি ভঙ্গ করছেন, কোনও প্রমান ছাড়াই প্রিন্টফ কোনও সি কনস্ট্রাক্টের জন্য স্পষ্টভাবে প্রযোজ্য। বিশ্বব্যাপী নেমস্পেসকে বাদ দিয়ে আপনার একটি নেমস্পেসের ব্যবহার ভাল ধারণা নয়। এটি কেবল বিতর্কযোগ্য নয়
এলিস

5
@ অ্যালিস আপনি কি দয়া করে এটির মানটি উল্লেখ করতে পারেন? আমি এ জাতীয় কোনও মৌখিকতা সম্পর্কে অবগত নই।
কনরাড রুডল্ফ

3

সি ++ 11 স্ট্যান্ডার্ড থেকে:

প্রতিটি সি শিরোনাম, যার প্রত্যেকটিরই ফর্মের নাম .11 এর একটি নাম রয়েছে, এমন আচরণ করে যেন প্রমিত লাইব্রেরির নেমস্পেসে সংশ্লিষ্ট নামের শিরোনাম দ্বারা স্থান দেওয়া প্রতিটি নাম বিশ্বব্যাপী নেমস্পেসের ক্ষেত্রের মধ্যে স্থাপন করা হয়। এই নামগুলি প্রথমে নেমস্পেসের স্টেডিয়ামের নেমস্পেস স্কোপ (৩.৩. declared) এর মধ্যে ঘোষিত বা সংজ্ঞায়িত করা হয়েছে এবং তারপরে স্পষ্টভাবে ব্যবহার-ঘোষণা (rations.৩.৩) দ্বারা গ্লোবাল নেমস্পেস স্কোপে ইনজেকশন দেওয়া আছে কিনা তা অনির্ধারিত।

সুতরাং, আপনি যদি ব্যবহার করেন তবে আপনি <cstdio>নিশ্চিত হতে পারেন, এটি printfহবে namespace stdএবং তাই বিশ্বব্যাপী নেমস্পেসে নয়।
বিশ্বব্যাপী নেমস্পেস ব্যবহার করা নামের দ্বন্দ্ব তৈরি করে। এটি সি ++ উপায় নয়।

অতএব, আমি <cstdio>শিরোনাম ব্যবহার করছি এবং আপনাকে এটি করার পরামর্শ দিচ্ছি ।


4
যদিও আমি আশা করি এটি এইভাবে কাজ করে, এটি সত্য নয়। আপনি যদি অন্তর্ভুক্ত করেন তবে <cstdio>আপনি গ্যারান্টিযুক্ত যে স্টাড :: প্রিন্টফের অস্তিত্ব থাকবে তবে মানক থেকে কোনও গ্যারান্টি নেই যদি :: প্রিন্টএফ থাকবে বা অস্তিত্ব থাকবে না। আসলে, যে কম্পাইলার আমি কখনো এর :: printf, শুনেছি মধ্যে হয় বিশ্বব্যাপী নামস্থান মধ্যে ইনজেকশনের যখন আপনি অন্তর্ভুক্ত <cstdio>
wjl

3

আমার নিজস্ব অনুশীলন থেকে: std::উপসর্গ ব্যবহার করুন । অন্যথায় আপনি ভাসমান পয়েন্টগুলি ব্যবহার করার ক্ষেত্রে একদিন আপনাকে খুব বেদনাদায়কভাবে কামড় abs দেবে

অ-যোগ্যতাসম্পন্ন কিছু প্ল্যাটফর্মের উপর absসংজ্ঞায়িত ফাংশন বোঝায় int। অন্যদের উপর এটি ওভারলোড হয়। তবে std::absসর্বদা সব ধরণের জন্য ওভারলোড হয়।


2

কেবলমাত্র ব্যবহার printfনা std::করে কিছু নাম বিরোধ সৃষ্টি করতে পারে এবং প্রচুর সি ++ ডিভাস দ্বারা এটি একটি খারাপ অভ্যাস হিসাবে বিবেচিত হয়। গুগল এটিতে আপনার বন্ধু, তবে এখানে কয়েকটি লিঙ্ক রয়েছে আশা করি এটি সাহায্য করবে

"নেমস্পেস এসটিডি ব্যবহার করা" কেন খারাপ অভ্যাস হিসাবে বিবেচিত? http://www.cplusplus.com/forum/beginner/61121/


4
using namespace stdএকটি খারাপ অনুশীলন তবে কোয়ালিফায়ার printfছাড়া ব্যবহার করা এটি std::নয়।
সিন্ট্যাগমা

using namespace std;এখানে আমার সমস্যা না। আমি কখনই এটি ব্যবহার করি না। printf();এবং std::printf();সি ++ এ কাজ না করেই using namespace std;আমি প্রশ্ন পোস্ট করেছি।
DeiDei

নিবন্ধন করুন দুটি পরিস্থিতির মধ্যে কোনও পার্থক্য নেই।
কনরাড রুডল্ফ

আমি এটি কখনও std::printfপ্লেইন বিজোড় বলে মনে করি না ।
ট্রেনকি

@ কনরাড রুডল্ফ আমি বলিনি যে কোনও পার্থক্য আছে, আমি কেবল আমার মতামত প্রকাশ করেছি (আরও যুক্তির জন্য আমার উত্তর দেখুন)।
সিন্ট্যাগমা

2

স্টিডিওতে

এটি স্ট্যান্ডার্ড সি লাইব্রেরি শিরোনাম @ সি স্টডিও এইচ এর সি ++ সংস্করণ, এবং এর বিষয়বস্তু (বেশিরভাগ ক্ষেত্রে) সেই শিরোনামের সমান, তবে সবগুলি নেমস্পেস @ সি স্টেডে অন্তর্ভুক্ত রয়েছে (নাম বাদে যা ম্যাক্রো হিসাবে সংজ্ঞায়িত করা হয়েছে সি)।

সুতরাং এটি কোনও পার্থক্য করা উচিত নয়।

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