c++ - উনল - সি++ বই




C++ শনাক্তকারীতে আন্ডারস্কোর ব্যবহার করার নিয়ম কী? (4)

নামগুলির সংঘর্ষ এড়াতে নিয়মগুলি উভয় সি ++ স্ট্যান্ডার্ডে (স্ট্রাউস্ট্রপ বই দেখুন) এবং C ++ গুরুগুলি (Sutter, ইত্যাদি) দ্বারা উল্লেখ করা হয়েছে।

ব্যক্তিগত নিয়ম

কারন আমি মামলাগুলি মোকাবেলা করতে চাইনি এবং একটি সাধারণ নিয়ম চেয়েছিলেন, আমি একটি ব্যক্তিগত ডিজাইন তৈরি করেছি যা সহজ এবং সঠিক উভয়ই:

একটি প্রতীক নামকরণ করার সময়, আপনি কম্পাইলার / ওএস / স্ট্যান্ডার্ড লাইব্রেরিগুলির সাথে সংঘর্ষ এড়াতে পারবেন যদি আপনি:

  • একটি underscore সঙ্গে একটি প্রতীক শুরু করবেন না
  • ভিতরে দুই consecutive underscores সঙ্গে একটি প্রতীক নাম না।

অবশ্যই, একটি অনন্য নামস্থান আপনার কোড নির্বাণ সংঘর্ষ এড়াতে সাহায্য করে (কিন্তু মন্দ ম্যাক্রো বিরুদ্ধে রক্ষা করবে না)

কিছু উদাহরণ

(আমি ম্যাক্রো ব্যবহার করি কারণ তারা সি / সি ++ প্রতীকগুলির কোড-দূষণকারী, কিন্তু এটি পরিবর্তনশীল নাম থেকে শ্রেণির নাম হতে পারে)

#define _WRONG
#define __WRONG_AGAIN
#define RIGHT_
#define WRONG__WRONG
#define RIGHT_RIGHT
#define RIGHT_x_RIGHT

C ++ 0x খসড়া থেকে এক্সট্রাক্টস

n3242.pdf ফাইল থেকে (আমি চূড়ান্ত স্ট্যান্ডার্ড পাঠ্য অনুরূপ হতে আশা করি):

17.6.3.3.2 গ্লোবাল নাম [global.names]

নাম এবং ফাংশন স্বাক্ষর নির্দিষ্ট সেট সবসময় বাস্তবায়ন করার জন্য সংরক্ষিত হয়:

- প্রতিটি নাম যা একটি ডবল আন্ডারস্কোর _ _ ধারণ করে বা একটি আন্ডারস্কোর দিয়ে শুরু হয় তারপরে একটি বড় হাতের অক্ষর (2.12) অনুসরণ করে যে কোনও ব্যবহারের জন্য বাস্তবায়নের জন্য সংরক্ষিত।

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

কিন্তু:

17.6.3.3.5 ব্যবহারকারী-সংজ্ঞায়িত আক্ষরিক প্রতিক্রিয়া [usrlit.suffix]

আন্ডারস্কোরের সাথে শুরু না করে লিটারেল প্রিফিক্স সনাক্তকারীরা ভবিষ্যতের মানদণ্ডের জন্য সংরক্ষিত।

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

C ++ এর মধ্যে সাধারণ ভেরিয়েবলগুলিকে নামকরণের জন্য কোনও প্রিফিক্স নামকরণ করা সাধারণ, যা তারা স্থানীয় ভেরিয়েবল বা পরামিতিগুলির পরিবর্তে সদস্য ভেরিয়েবল হিসাবে চিহ্নিত করতে সাধারণ। আপনি যদি MFC পটভূমি থেকে এসে থাকেন তবে সম্ভবত আপনি m_foo ব্যবহার m_foo । আমি মাঝে মাঝে myFoo দেখা করেছি।

C # (অথবা সম্ভবত কেবলমাত্র .NET) _foo কেবল একটি আন্ডারস্কোর ব্যবহার করার সুপারিশ করা হচ্ছে। এই সি ++ মান দ্বারা অনুমোদিত হয়?


নিয়ম (যা সি ++ 11 তে পরিবর্তন হয়নি):

  • implementation ম্যাক্রো হিসাবে ব্যবহারের জন্য সহ কোন সুযোগ সংরক্ষিত:
    • একটি উচ্চতর অক্ষর দ্বারা অবিলম্বে অনুসরণ একটি আন্ডারস্কোর সঙ্গে শুরু শনাক্তকারী
    • সনাক্তকারীগুলিকে সংলগ্ন আন্ডারস্কোর (বা "ডাবল আন্ডারস্কোর")
  • গ্লোবাল নামস্থান সংরক্ষিত:
    • একটি underscore সঙ্গে শুরু শনাক্তকারী
  • এছাড়াও, std namespace সবকিছু সংরক্ষিত। (যদিও আপনি টেমপ্লেট বিশেষীকরণ যোগ করার অনুমতি দেওয়া হয়।)

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

17.4.3.1.2 গ্লোবাল নাম [lib.global.names]

নাম এবং ফাংশন স্বাক্ষর নির্দিষ্ট সেট সবসময় বাস্তবায়ন করার জন্য সংরক্ষিত হয়:

  • প্রতিটি নাম যা একটি ডবল আন্ডারস্কোর ( __ ) ধারণ করে বা আন্ডারস্কোর অক্ষরের (2.11) অনুসরণ করে আন্ডারস্কোর দিয়ে শুরু হয়, যে কোনও ব্যবহারের জন্য বাস্তবায়নের জন্য সংরক্ষিত।
  • প্রতিটি নাম যা একটি আন্ডারস্কোর দিয়ে শুরু হয় গ্লোবাল নেমস্পেসে একটি নাম হিসাবে ব্যবহার করার জন্য বাস্তবায়নের জন্য সংরক্ষিত। 165

165) এই নামগুলি নামস্থান ::std (17.4.3.1) এ সংরক্ষিত রয়েছে।

কারণ সি ++ সি স্ট্যান্ডার্ড (1.1 / 2, সি ++ 03) এবং সি 99 এর উপর ভিত্তি করে একটি আদর্শ রেফারেন্স (1.2 / 1, সি ++ 03) এগুলি প্রয়োগ করা হয়, 1999 সি স্ট্যান্ডার্ড থেকেও:

7.1.3 সংরক্ষিত সনাক্তকারী

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

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

অন্য কোন সনাক্তকারী সংরক্ষিত হয়। যদি প্রোগ্রাম কোনও রেফারেন্সে ঘোষণা করে বা সংজ্ঞায়িত করে তবে এটি সংরক্ষিত (7.1.4 অনুসারে অনুমোদিত), অথবা একটি ম্যাক্রো নাম হিসাবে একটি সংরক্ষিত সনাক্তকারী সংজ্ঞায়িত করে, আচরণটি অনির্ধারিত।

প্রোগ্রামটি যদি (উপরে #undef ) উপরে তালিকাভুক্ত প্রথম গোষ্ঠীর একটি সনাক্তকারীর কোনও ম্যাক্রো সংজ্ঞা মুছে ফেলে তবে আচরণটি অনির্ধারিত।

154) বহিরাগত সংযোগের সাথে সংরক্ষিত সনাক্তকারীর তালিকাতে math_errhandling , setjmp , setjmp , এবং va_end অন্তর্ভুক্ত রয়েছে।

অন্যান্য সীমাবদ্ধতা প্রযোজ্য হতে পারে। উদাহরণস্বরূপ, POSIX স্ট্যান্ডার্ডটি অনেকগুলি সনাক্তকারীকে সংরক্ষণ করে যা স্বাভাবিক কোডগুলিতে দেখা যেতে পারে:

  • একটি রাজধানী E দিয়ে শুরু হওয়া নামগুলি একটি সংখ্যা বা বড় হাতের অক্ষর অনুসরণ করে:
    • অতিরিক্ত ত্রুটি কোড নাম জন্য ব্যবহার করা যেতে পারে।
  • যে নামগুলির সাথে শুরু হয় বা একটি ছোট হাতের অক্ষর দ্বারা অনুসরণ করা হয়
    • অতিরিক্ত চরিত্র টেস্টিং এবং রূপান্তর ফাংশন জন্য ব্যবহার করা যেতে পারে।
  • যে নামগুলি LC_ দিয়ে শুরু হয় LC_ একটি বড় হাতের অক্ষর অনুসরণ করে
    • লোকেল বৈশিষ্ট্য উল্লেখ নির্দিষ্ট ম্যাক্রো জন্য ব্যবহার করা যেতে পারে।
  • সমস্ত বিদ্যমান গাণিতিক ফাংশনগুলির নাম f বা l এর সাথে সম্পৃক্ত
    • যথাক্রমে float এবং দীর্ঘ ডবল আর্গুমেন্ট উপর কাজ করে যে সংশ্লিষ্ট ফাংশন জন্য।
  • SIG দিয়ে শুরু হওয়া নামগুলি একটি বড় হাতের অক্ষর দ্বারা সংরক্ষিত থাকে
    • অতিরিক্ত সংকেত নাম জন্য।
  • SIG_ দিয়ে শুরু হওয়া নামগুলি একটি বড় হাতের অক্ষর দ্বারা সংরক্ষিত থাকে
    • অতিরিক্ত সংকেত কর্মের জন্য।
  • একটি ছোট হাতের অক্ষর অনুসরণ str , mem , বা wcs দিয়ে শুরু হওয়া নামগুলি সংরক্ষিত
    • অতিরিক্ত স্ট্রিং এবং অ্যারের ফাংশন জন্য।
  • যে কোনও ছোট হাতের অক্ষর বা X দ্বারা অনুসরণ করা PRI বা SCN সাথে শুরু হওয়া নামগুলি সংরক্ষিত
    • অতিরিক্ত বিন্যাস স্পেসিফিকার ম্যাক্রো জন্য
  • _t এর সাথে শেষ হওয়া নামগুলি সংরক্ষিত
    • অতিরিক্ত ধরনের নাম জন্য।

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

ব্যক্তিগতভাবে আমি শুধু underscores সঙ্গে শনাক্তকারী শুরু করবেন না। আমার নিয়ম নতুন সংযোজন: কোথাও ডবল underscores ব্যবহার করবেন না, আমি খুব কমই underscore ব্যবহার হিসাবে যা সহজ।

এই প্রবন্ধে গবেষণা করার পরে আমি আর _t দিয়ে আমার সনাক্তকারীগুলিকে শেষ করব না কারণ এটি POSIX মান দ্বারা সংরক্ষিত।

_t সাথে শেষ হওয়া কোন সনাক্তকারী সম্পর্কে নিয়ম আমাকে অনেক অবাক করেছে। আমি একটি POSIX মান (এখনো নিশ্চিত না) যে স্পষ্টতা এবং অফিসিয়াল অধ্যায় এবং আয়াত খুঁজছেন। এটি GNU libtool ম্যানুয়াল থেকে , সংরক্ষিত নাম তালিকাভুক্ত করা হয়।

CesarB opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html সংরক্ষিত প্রতীকগুলিতে নিচের লিঙ্কটি সরবরাহ করে এবং 'যেগুলি অন্যান্য অনেক সংরক্ষিত উপসর্গ এবং প্রতিক্রিয়া ... সেখানে পাওয়া যেতে পারে' নোট প্রদান করে। POSIX 2008 সংরক্ষিত প্রতীক এখানে সংজ্ঞায়িত করা হয়। সীমাবদ্ধতা উপরে কিছু বেশী কিছু nuanced হয়।


হ্যাঁ, আন্ডারস্কোরগুলি কোন শনাক্তকারীতে যে কোনও স্থানে ব্যবহার করা যেতে পারে। আমি বিশ্বাস করি নিয়মগুলি হল: AZ, AZ, _ প্রথম চরিত্রের মধ্যে এবং যেগুলি নিম্নলিখিত অক্ষরগুলির জন্য 0-9।

আন্ডারস্কোর উপসর্গগুলি সি কোডের মধ্যে সাধারণ - একটি একক আন্ডারস্কোর মানে "ব্যক্তিগত", এবং ডাবল আন্ডারস্কোরগুলি সাধারণত কম্পাইলার দ্বারা ব্যবহারের জন্য সংরক্ষিত থাকে।


MSDN থেকে:

একটি শনাক্তকারীর শুরুতে দুটি ক্রমিকের আন্ডারস্কোর ক্যারেক্টার (__) ব্যবহার করুন, বা একটি মূল লিপি দ্বারা অনুসরণ করা একটি একক নেতৃস্থানীয় আন্ডারস্কোর, সমস্ত স্কোপগুলিতে C ++ প্রয়োগগুলির জন্য সংরক্ষিত। বর্তমান বা ভবিষ্যতের সংরক্ষিত সনাক্তকারীগুলির সাথে সম্ভাব্য দ্বন্দ্বের কারণে ফাইলের সুযোগের সাথে ছোট হাতের অক্ষরগুলির জন্য একটি শীর্ষস্থানীয় আন্ডারস্কোর ব্যবহার করা উচিত নয়।

এর মানে হল আপনি একটি সদস্যের পরিবর্তনশীল উপসর্গ হিসাবে একটি একক আন্ডারস্কোর ব্যবহার করতে পারেন, যতক্ষণ এটি নিম্ন-কেসের অক্ষর অনুসরণ করে।

এই দৃশ্যত সি ++ মান বিভাগ 17.4.3.1.2 থেকে নেওয়া হয়, কিন্তু আমি সম্পূর্ণ মান অনলাইন জন্য একটি মূল উৎস খুঁজে পাচ্ছি না।

এই প্রশ্নটি দেখুন







c++-faq