লোকেরা কেন সি ++ এ এত বেশি __ (ডাবল আন্ডারস্কোর) ব্যবহার করে?


96

আমি কিছু ওপেন সোর্স সি ++ কোড দিয়ে দেখেছিলাম এবং কোডটিতে ব্যবহৃত মূলত ভেরিয়েবলের নামের শুরুতে প্রচুর ডাবল লক্ষ্য করেছি।

return __CYGWIN__;

শুধু ভাবছি এর কারণ আছে কি, নাকি এটি কিছু লোকের কোড শৈলী? আমি ভাবতে পারি যে এটি পড়তে আমার কষ্ট হয়।


4
কেন পড়া শক্ত? এটি বেশিরভাগই উদ্ধৃতিগুলির মতো একটি ডিলিমিটার হিসাবে ডিজাইন করা হয়েছে। আমার মনে আছে, এটি মূলত বিল্টিন ধ্রুবকের জন্য ব্যবহৃত হয়।
ম্যাথু শার্লে

4
না, এটি কোন সীমানা নয়। আন্ডারস্কোরগুলি ব্যবহারকারীর উত্স কোড ব্যবহার করতে পারে এমন নামগুলি থেকে প্রয়োগের জন্য সংরক্ষিত নামগুলি পৃথক করতে ব্যবহৃত হয়। ব্যবহারকারীরা করতে পারেন #define FOO 1তবে তাদের অবশ্যই করা উচিত নয় #define __FOO__ 1এবং তাই প্রয়োগটি __FOO__নিজের ম্যাক্রো, ভেরিয়েবল, ফাংশন ইত্যাদির জন্য নামটি ব্যবহার করতে পারে
জোনাথন ওয়েকেলি

আমি মনে করি ম্যাথু বলতে বোঝায় এটি স্টাইলিস্টিকভাবে / ভিজ্যুয়াল একটি ডিলিমিটার, কার্যকরীভাবে নয়। যা একটি আকর্ষণীয় অনুমান, তবে আমি এর আগে যা পড়েছি এবং জোনাথনের উত্তরটি দেওয়া হয়েছে তা ভুল।
twitchdotcom KANJICODER

উত্তর:


130

সি ++, বিধি এবং সুপারিশগুলিতে প্রোগ্রামিং থেকে :

শনাক্তকারীগুলিতে দুটি আন্ডারস্কোর (__ __ ') ব্যবহার এএনএসআই-সি স্ট্যান্ডার্ড অনুযায়ী সংকলকটির অভ্যন্তরীণ ব্যবহারের জন্য সংরক্ষিত।

অ্যান্ডস্কোর (`_ ') প্রায়শই গ্রন্থাগারের ফাংশনগুলির নামে ব্যবহৃত হয় (যেমন" _ মেইন "এবং" _ইজিকিট ")। সংঘর্ষ এড়ানোর জন্য, আন্ডারস্কোর দিয়ে কোনও সনাক্তকারী শুরু করবেন না।


4
এই গাইডটি দেখে মনে হচ্ছে এটি লেখার আগেই লেখা namespaceহয়েছিল।
সিজেড

এটি ইম্পেরিয়াল কলেজ লন্ডন থেকেও ছিল, সি ++ স্ট্যান্ডার্ড থেকে নয়; এটি ভাল পরামর্শ হতে পারে।
stucash

4
@cz নেমস্পেসগুলি অপ্রাসঙ্গিক। একটি সিস্টেম শিরোনাম একটি ম্যাক্রো নাম সংজ্ঞায়িত করতে পারে যা আন্ডারস্কোর উদাহরণ দিয়ে শুরু হয় _main
মার্টিনকুনেভ

একক আন্ডারস্কোর দিয়ে ভিক্ষা করা শনাক্তকারীগুলি কেবল গ্লোবাল নেমস্পেসে সংরক্ষিত থাকে, তবে বড় হাতের অক্ষর দ্বারা বর্ণিত একক আন্ডারস্কোর দিয়ে শুরু করা সনাক্তকারীরা যে কোনও জায়গায় ডাবল আন্ডারস্কোর সহ সনাক্তকারী হিসাবে সংরক্ষিত থাকে। এই তথ্যটি cppreferences.com
ওয়ার্ড হেড

51

তারা যদি না অনুভব করে যে তারা "বাস্তবায়নের অংশ", অর্থাৎ মানক গ্রন্থাগার, তবে তাদের উচিত নয় they

নিয়মগুলি মোটামুটি সুনির্দিষ্ট, এবং কিছু অন্যদের পরামর্শের তুলনায় কিছুটা বিশদ।

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

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

এই কারণেই মাইক্রোসফ্ট তাদের মূল রানটাইম লাইব্রেরি ফাংশনগুলির জন্য একটি শীর্ষস্থানীয় আন্ডারস্কোর এবং সমস্ত ছোট হাতের অক্ষরের সাথে ফাংশন নামগুলি ব্যবহার করে যা সি ++ মানের অংশ নয়। এই ফাংশনটির নামগুলি স্ট্যান্ডার্ড সি ++ ফাংশন বা ব্যবহারকারী কোড ফাংশনগুলির সাথে সংঘর্ষ না করার গ্যারান্টিযুক্ত।


4
সি ++ এ আমি কেবল [লেক্স.নাম] এবং বিশ্বব্যাপী নামের জন্য [গ্লোবাল.নাম] দেখতে পাচ্ছি। আপনি রেফারেন্স দিতে পারেন? ধন্যবাদ
a.lasram

36

সি ++ স্ট্যান্ডার্ড অনুসারে, একটি আন্ডারস্কোর দিয়ে শুরু হওয়া সনাক্তকারীগুলি লাইব্রেরির জন্য সংরক্ষিত। দুটি আন্ডারস্কোর দিয়ে শুরু করা শনাক্তকারীগুলি সংকলক বিক্রেতাদের জন্য সংরক্ষিত।


18
এর চেয়েও বেশি: তাদের যে কোনও জায়গায় ডাবল আন্ডারস্কোরযুক্ত সনাক্তকারীগুলি সংরক্ষিত। 17.4.3.1.2
স্টিভ

সি ++ এ আমি কেবল [লেক্স.নাম] এবং বিশ্বব্যাপী নামের জন্য [গ্লোবাল.নাম] দেখতে পাচ্ছি। আপনি রেফারেন্স দিতে পারেন? ধন্যবাদ
a.lasram

11

পূর্বোক্ত মন্তব্যগুলি সঠিক। __Symbol__সাধারণত আপনার সহায়ক সংকলক (বা প্রিপ্রোসেসর) বিক্রেতা দ্বারা সরবরাহ করা একটি যাদু টোকেন। সম্ভবত এগুলির মধ্যে সর্বাধিক ব্যবহৃত হয় __FILE__এবং __LINE__যা বর্তমান ফাইলের নাম এবং লাইন নম্বর নির্দেশ করতে সি প্রিপ্রসেসর দ্বারা প্রসারিত হয়। আপনি যখন ত্রুটির পাঠ্য অবস্থান সহ কোনও প্রকারের প্রোগ্রামের ব্যর্থতা লগ করতে চান তখন তা সহজ।


8

এটি এমন কিছু যা আপনি 'সাধারণ' কোডে করতে চান না। এটি নিশ্চিত করে যে সংকলক এবং সিস্টেম লাইব্রেরিগুলি এমন চিহ্নগুলি সংজ্ঞায়িত করতে পারে যা আপনার সাথে সংঘর্ষে নেমে না।


5

ডাবল আন্ডারস্কোরগুলি প্রয়োগের জন্য সংরক্ষিত

শীর্ষে ভোট দেওয়া উত্তর C ++ এ প্রোগ্রামিংয়ের উদ্ধৃতি দেয় : বিধি এবং প্রস্তাবনা :

"শনাক্তকারীগুলিতে দুটি আন্ডারস্কোর (` __ ') ব্যবহার এএনএসআই-সি স্ট্যান্ডার্ড অনুযায়ী সংকলকের অভ্যন্তরীণ ব্যবহারের জন্য সংরক্ষিত। "

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

সি ++

সি ++ (বর্তমান কার্যকরী খসড়া, 2019-5-26 অ্যাক্সেস করা হয়েছে) এতে উল্লেখ করেছে lex.name:

  • প্রতিটি সনাক্তকারী যাতে ডাবল আন্ডারস্কোর __ থাকে বা আন্ডারস্কোর দিয়ে শুরু হয় বড় অক্ষর দ্বারা অনুসরণ করা হয় কোনও ব্যবহারের জন্য প্রয়োগের জন্য সংরক্ষিত।
  • আন্ডারস্কোর দিয়ে শুরু হওয়া প্রতিটি শনাক্তকারী গ্লোবাল নেমস্পেসে নাম হিসাবে ব্যবহারের জন্য প্রয়োগের জন্য সংরক্ষিত।

যদিও এই প্রশ্নটি সি ++ এর সাথে সুনির্দিষ্ট, আমি সি স্ট্যান্ডার্ড 99 এবং 17 থেকে প্রাসঙ্গিক বিভাগগুলি উদ্ধৃত করেছি:

C99 বিভাগ 7.1.3

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

সি 17 একই কথা বলেছে সি 99।

বাস্তবায়ন কী ?

সি / সি জন্য ++ বাস্তবায়ন ঢিলেঢালাভাবে ব্যবহারকারীর কাছে উৎস ফাইল থেকে একটি এক্সিকিউটেবল উত্পাদন করতে প্রয়োজনীয় সেট সম্পদ বোঝায়। এটা অন্তর্ভুক্ত:

  • প্রিপ্রোসেসর
  • সংকলক
  • লিঙ্কার
  • স্ট্যান্ডার্ড লাইব্রেরি

উদাহরণ বাস্তবায়ন

উইকিপিডিয়ায় বিভিন্ন সি ++ প্রয়োগের উল্লেখ রয়েছে । (কোনও অ্যাঙ্কর লিঙ্ক নেই, সিটিআরএল + এফ "বাস্তবায়ন")

ডিজিটাল মার্সের সি / সি ++ বাস্তবায়নের একটি উদাহরণ যা তাদের বৈশিষ্ট্যের জন্য কিছু কীওয়ার্ড সংরক্ষণ করে।


3

অন্যান্য অনেক লোক গ্রন্থাগারগুলি ছাড়াও যা সম্পর্কে প্রতিক্রিয়া জানিয়েছিল, কিছু লোক প্রিপ্রসেসর ব্যবহারের জন্য ম্যাক্রো বা # নির্ধারিত মানগুলির নামও দেয়। এটি এর সাথে কাজ করা সহজ করবে এবং পুরানো সংকলকগুলিতে বাগগুলি প্রায় কাজ করার অনুমতি দিতে পারে।

উল্লিখিত অন্যদের মতো, এটি নামের সংঘর্ষ রোধ করতে সহায়তা করে এবং গ্রন্থাগার ভেরিয়েবল এবং আপনার নিজস্বগুলির মধ্যে চিত্রিত করতে সহায়তা করে।

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