স্ট্যাটিক কনস্ট বনাম # ডেফাইন


212

static constপ্রিপ্রোসেসরের চেয়ে ভার্স ব্যবহার করা কি ভাল #define? বা হতে পারে এটি প্রসঙ্গে নির্ভর করে?

প্রতিটি পদ্ধতির সুবিধা / অসুবিধাগুলি কী কী?


14
স্কট মায়ার্স খুব সুন্দর এবং পুঙ্খানুপুঙ্খভাবে এই বিষয়টি কভার করে। "কার্যকর সি ++ তৃতীয় সংস্করণ" এ তার আইটেম # 2। শ্রেণি নির্দিষ্ট ধ্রুবকগুলির জন্য দুটি বিশেষ ক্ষেত্রে (1) স্ট্যাটিক কনস্টকে শ্রেণির সুযোগের মধ্যে পছন্দ করা হয়; (2) নেমস্পেস বা বেনামে স্কোপ কনস্টকে # ডিফাইন এর চেয়ে বেশি পছন্দ করা হয়।
এরিক

2
আমি এনামদের পছন্দ করি। কারণ এটি উভয়ের সংকর। আপনি এটির পরিবর্তনশীল তৈরি না করলে স্থান দখল করে না। আপনি যদি কেবল ধ্রুবক হিসাবে ব্যবহার করতে চান তবে এনাম সেরা বিকল্প best এটি সি / সি ++ 11 স্ট্যান্ডে টাইপ সুরক্ষা এবং একটি নিখুঁত ধ্রুবক রয়েছে। # ডেফাইনটি টাইপ অনিরাপদ, সংকলক এটি অপ্টিমাইজ করতে না পারলে কনস্টেস স্থান নেয়।
সিদ্ধসিংহ

1
ব্যবহার করতে হবে #defineবা static const(স্ট্রিংগুলির জন্য) আমার সিদ্ধান্তটি আরম্ভের দিক দ্বারা চালিত হয়েছে (এটি নীচের উত্তরের মাধ্যমে উল্লেখ করা হয়নি): যদি কেবল নির্দিষ্ট সংকলনের ইউনিটের মধ্যে ধ্রুবক ব্যবহার করা হয় তবে আমি সাথে static constথাকি, অন্যথায় আমি ব্যবহার করি #define- স্থির ক্রম আরম্ভকরণ ফিয়াস্কো এড়ানো isocpp.org/wiki/faq/ctors#static-init-order
মার্টিন ডিভোরাক

যদি const, constexprবা enumবা কোনও প্রকার আপনার ক্ষেত্রে কাজ করে, তবে এটিকে পছন্দ করুন#define
ফিল 1970

@ মার্টিনডভোরাক " স্ট্যাটিক অর্ডার ইনিশিয়ালাইজেশন ফিয়াসকো এড়ানো " "ধ্রুবকদের জন্য এটি কীভাবে সমস্যা?
কৌতূহলী

উত্তর:


139

ব্যক্তিগতভাবে, আমি প্রিপ্রোসেসরকে ঘৃণা করি, তাই আমি সর্বদা সাথে যাব const

একটির প্রধান সুবিধাটি #defineহ'ল এটিতে আপনার প্রোগ্রামে সঞ্চয় করার জন্য কোনও মেমরির প্রয়োজন হয় না, কারণ এটি সত্যিই কেবল একটি আক্ষরিক মান দিয়ে কিছু পাঠ্য প্রতিস্থাপন করে। এটিরও সুবিধা রয়েছে যে এটির কোনও প্রকার নেই, সুতরাং এটি সতর্কতা উত্পন্ন না করে কোনও পূর্ণসংখ্যার মানের জন্য ব্যবহার করা যেতে পারে।

" const" এর সুবিধাগুলি হ'ল এগুলি স্কোপ করা যায় এবং এগুলি এমন পরিস্থিতিতে ব্যবহার করা যেতে পারে যেখানে কোনও বস্তুর পয়েন্টারটি পাস করার প্রয়োজন হয়।

staticযদিও আপনি " " অংশটির সাথে ঠিক কী অর্জন করছেন তা আমি জানি না । আপনি যদি বিশ্বব্যাপী ঘোষণা করে থাকেন, আমি এটি ব্যবহারের পরিবর্তে এটি একটি বেনাম নামস্থানে রেখে দেব static। উদাহরণ স্বরূপ

namespace {
   unsigned const seconds_per_minute = 60;
};

int main (int argc; char *argv[]) {
...
}

8
স্ট্রিং কনস্ট্যান্টগুলি বিশেষত এর মধ্যে একটি যা #defineডি হওয়ার ফলে উপকৃত হতে পারে , কমপক্ষে যদি সেগুলি বড় স্ট্রিং ধ্রুবকগুলির জন্য "বিল্ডিং ব্লক" হিসাবে ব্যবহার করা যায়। একটি উদাহরণের জন্য আমার উত্তর দেখুন।
অ্যান্ট

62
#defineকোন মেমরি ব্যবহার করছেন না সুবিধা বেঠিক নয়। উদাহরণ "60" কোথাও সঞ্চিত হবে, নির্বিশেষে এটা যদি হয়ে গেছে static constবা #define। প্রকৃতপক্ষে, আমি সংকলকগুলি দেখেছি যেখানে # সংজ্ঞা ব্যবহারের ফলে মেমরির প্রচুর পরিমাণে (কেবল পঠনযোগ্য) কারণ হয়ে যায় এবং স্ট্যাটিক কনস্টে কোনও অপ্রয়োজনীয় মেমরি ব্যবহার করে না।
গিলাদ নাওর

3
একটি # সংজ্ঞা যেমন আপনি এটি টাইপ করে থাকেন, তাই এটি অবশ্যই স্মৃতি থেকে আসে না।
শ্রদ্ধেয়

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

13
@ গিলাদ-নাওর, আপনি সাধারণভাবে ঠিক আছেন তবে like০ এর মতো ছোট ছোট পূর্ণসংখ্যা আসলে কখনও কখনও আংশিক ব্যতিক্রম হতে পারে। কিছু নির্দেশিকা সেটগুলিতে সরাসরি নির্দেশ স্ট্রিমটিতে পূর্ণসংখ্যা বা পূর্ণসংখ্যার উপসেটটি এনকোড করার ক্ষমতা থাকে। উদাহরণস্বরূপ এমআইপিগুলি তাত্ক্ষণিকভাবে যুক্ত করুন ( cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/addi.html )। এই ধরণের ক্ষেত্রে একটি # সংজ্ঞায়িত পূর্ণসংখ্যা সত্যই কোনও স্থান ব্যবহার করার কথা বলা যেতে পারে যেহেতু সংকলিত বাইনারিটিতে এটি নির্দেশাবলীতে কয়েকটি অতিরিক্ত বিট দখল করে যা কোনওভাবেই বিদ্যমান ছিল।
আহকক্স

242

ব্যবহারের উপর নির্ভর করে #defineএস, constএস এবং (আপনি কী ভুলে গেছেন) enumএর মধ্যে পেশাদার এবং কনস :

  1. enums:

    • পূর্ণসংখ্যার মানগুলির জন্য কেবল সম্ভব
    • যথাযথভাবে স্কোপড / শনাক্তকারী সংঘর্ষের সমস্যাগুলি সুন্দরভাবে পরিচালনা করা হয়, বিশেষত সি ++ ১১ টি এনাম ক্লাসে যেখানে স্কুলে স্ক্র্যাপ enum class Xদ্বারা বিভাজন হয়X::
    • দৃ strongly়ভাবে টাইপ করা হয়েছে, তবে একটি বড়-পর্যাপ্ত স্বাক্ষরযুক্ত বা স্বাক্ষরবিহীন কোন আকারের উপরে যার উপর আপনার C ++ 03 তে নিয়ন্ত্রণ নেই (যদিও এনাম যদি স্ট্রাক / এর সদস্য হয় তবে আপনি কিছুটা ক্ষেত্র নির্দিষ্ট করতে পারেন যাতে সেগুলি প্যাক করা উচিত you শ্রেণি / ইউনিয়ন), যখন সি ++ 11 এর ডিফল্ট থাকে intতবে প্রোগ্রামার দ্বারা স্পষ্টত সেট করা যায়
    • ঠিকানাটি গ্রহণ করতে পারে না - ব্যবহারের পয়েন্টগুলিতে গণনার মানগুলি কার্যকরভাবে ইনলাইন প্রতিস্থাপন করা হয় বলে একটি নেই
    • শক্তিশালী ব্যবহারের নিয়ন্ত্রণ (উদাহরণস্বরূপ বর্ধন - template <typename T> void f(T t) { cout << ++t; }সংকলন করবে না, যদিও আপনি অন্তর্ভুক্ত নির্মাতা, ingালাই অপারেটর এবং ব্যবহারকারী-সংজ্ঞায়িত অপারেটরগুলির সাথে একটি শ্রেণিতে একটি এনামকে আবদ্ধ করতে পারেন)
    • প্রতিটি ধ্রুবকের ধরণটি এনোলেজিং এনাম থেকে নেওয়া, সুতরাং template <typename T> void f(T)আলাদা এনাম থেকে একই সংখ্যাটি পাস করার সময় একটি স্বতন্ত্র ইনস্ট্যান্টেশন পান, এগুলি সমস্তই প্রকৃত f(int)ইনস্ট্যান্টেশন থেকে পৃথক । প্রতিটি ফাংশনের অবজেক্ট কোড অভিন্ন (অ্যাড্রেস অফসেটগুলি উপেক্ষা করে) হতে পারে, তবে আমি অপ্রয়োজনীয় কপিগুলি অপসারণের জন্য কোনও সংকলক / লিঙ্কার আশা করব না, যদিও আপনি যত্নশীল হন তবে আপনার সংকলক / লিঙ্কার পরীক্ষা করতে পারেন।
    • এমনকি টাইপফ / ডিক্লাইপ সহ, সংখ্যাসূচক_মিলিটগুলি অর্থবোধক মান এবং সংমিশ্রণের সেটগুলিতে দরকারী অন্তর্দৃষ্টি প্রদানের আশা করতে পারে না (প্রকৃতপক্ষে, "আইনী" সংমিশ্রণগুলি উত্স কোডেও চিহ্নিত নয়, বিবেচনা করুন enum { A = 1, B = 2 }- A|Bএকটি প্রোগ্রাম লজিক থেকে "আইনী" দৃষ্টিকোণ?)
    • এনটিএমের টাইপনেমটি আরটিটিআই, সংকলক বার্তাগুলি ইত্যাদিতে বিভিন্ন জায়গায় উপস্থিত হতে পারে - সম্ভবত দরকারী, সম্ভবত অনর্থক
    • অনুবাদ ইউনিটটি আসলে মানটি না দেখে আপনি কোনও গণনা ব্যবহার করতে পারবেন না, যার অর্থ লাইব্রেরি এপিআই-এ এনামদের শিরোনামে উদ্ভাসিত মানগুলির প্রয়োজন হয়, makeএবং অন্যান্য টাইমস্ট্যাম্প-ভিত্তিক পুনঃসংশোধন সরঞ্জামগুলি ক্লায়েন্টের পুনঃসংশোধনকে ট্রিগার করবে যখন তারা পরিবর্তিত হবে (খারাপ! )

  1. consts:

    • সঠিকভাবে স্কোপড / শনাক্তকারী সংঘর্ষের সমস্যাগুলি সুন্দরভাবে পরিচালনা করা হয়েছে
    • শক্তিশালী, একক, ব্যবহারকারী নির্দিষ্ট প্রকার
      • আপনি #defineআলা "টাইপ" করার চেষ্টা করতে পারেন #define S std::string("abc"), তবে ধ্রুবক ব্যবহারের প্রতিটি স্থানে স্বতন্ত্র টেম্পোরারিগুলির পুনরাবৃত্তি নির্মাণ এড়াতে পারে
    • একটি সংজ্ঞা বিধি জটিলতা
    • ঠিকানা নিতে পারেন, তাদের কাছে কনস্টের রেফারেন্স তৈরি করতে পারেন ইত্যাদি
    • একটি অ- constমানের সাথে সর্বাধিক অনুরূপ , যা দুজনের মধ্যে স্যুইচ করা হলে কাজ এবং প্রভাবকে কমিয়ে দেয়
    • স্থানীয়করণের পুনরায় সংকলন এবং কেবল ক্লায়েন্টের লিঙ্কগুলি পরিবর্তনটি গ্রহণের সুযোগ করে, মানটি বাস্তবায়ন ফাইলের অভ্যন্তরে স্থাপন করা যেতে পারে

  1. #defines:

    • "গ্লোবাল" স্কোপ / বিরোধী ব্যবহারের আরও প্রবণতা, যা সমঝোতা ত্রুটি বার্তাগুলির চেয়ে সঙ্কলিত সমস্যাগুলি এবং অপ্রত্যাশিত রান-টাইম ফলাফল তৈরি করতে পারে; এটি প্রশমিত করার জন্য:
      • দীর্ঘ, অস্পষ্ট এবং / অথবা কেন্দ্রীয়ভাবে সমন্বিত শনাক্তকারী এবং তাদের অ্যাক্সেস ব্যবহার করা / বর্তমান / কোয়েনিগ-বর্ণিত নেমস্পেস, নেমস্পেস অ্যালিয়াসেস ইত্যাদি স্পষ্টভাবে মিলে যাওয়া থেকে উপকৃত হতে পারে না etc.
      • যখন ট্রাম্পিং সেরা অনুশীলনটি টেমপ্লেট প্যারামিটার শনাক্তকারীকে একক-অক্ষর বড় হাতের অক্ষর (সম্ভবত একটি সংখ্যা অনুসরণ করে) করতে দেয়, ছোট হাতের অক্ষর ছাড়াই শনাক্তকারীদের অন্য ব্যবহারের জন্য প্রচলিতভাবে সংরক্ষিত থাকে এবং প্রিপ্রোসেসর সংজ্ঞায়িত (ওএস এবং সি / সি ++ লাইব্রেরির বাইরে) প্রত্যাশিত হয় হেডার)। এন্টারপ্রাইজ স্কেল প্রিপ্রোসেসর ব্যবহারের ব্যবস্থাপনযোগ্য থাকার জন্য এটি গুরুত্বপূর্ণ। তৃতীয় পক্ষের গ্রন্থাগারগুলি মেনে চলার আশা করা যায়। এটি পর্যালোচনা করে / থেকে সংজ্ঞায়িত কনসেন্টগুলি বা এনামগুলিতে স্থানান্তরিত হওয়ার অর্থ মূলধন পরিবর্তনের সাথে জড়িত এবং তাই "সাধারণ" রিকম্পাইলের পরিবর্তে ক্লায়েন্ট উত্স কোডে সম্পাদনা প্রয়োজন। (ব্যক্তিগতভাবে, আমি গণনাগুলির প্রথম অক্ষরকে মূলধন হিসাবে চিহ্নিত করি তবে কনসটস নয়, তাই আমি এই দুটিয়ের মধ্যেও স্থানান্তরিত হব - সম্ভবত পুনর্বিবেচনা করার সময় হবে time)
    • আরও সংকলন-সময়ের ক্রিয়াকলাপগুলি সম্ভব: স্ট্রিং আক্ষরিক সংক্ষিপ্তকরণ, স্ট্রিংফিকেশন (এর আকার নেওয়া), সনাক্তকারীগুলিতে সংমিশ্রণ
      • downside হয় যে দেওয়া হয় #define X "x"এবং কিছু ক্লায়েন্ট ব্যবহার Ala "pre" X "post", আপনি যদি চান অথবা করতে প্রয়োজন এক্স একটি আপনি, (বরং কম্পায়লেশান চেয়ে) ক্লায়েন্ট কোডে সম্পাদনাগুলি বাধ্য যেহেতু যে স্থানান্তরকে থেকে সহজ একটি ধ্রুবক বদলে রানটাইম-পরিবর্তনশীল পরিবর্তনশীল const char*বা const std::stringতারা দেওয়া ইতিমধ্যে সংযুক্তকরণের অপারেশন (যেমন নিগমবদ্ধ ব্যবহারকারী বাধ্য "pre" + X + "post"জন্য string)
    • sizeofসংজ্ঞায়িত সংখ্যাসূচক উপর সরাসরি ব্যবহার করতে পারবেন না
    • টাইপযুক্ত (তুলনা করা হলে জিসিসি সতর্ক করে না unsigned)
    • কিছু সংকলক / লিঙ্কার / ডিবাগার চেইন শনাক্তকারীকে উপস্থাপন করতে না পারে, সুতরাং আপনার "ম্যাজিক সংখ্যা" (স্ট্রিং, যাই হোক না কেন ...) দেখার দিকে কমিয়ে দেওয়া হবে
    • ঠিকানা নিতে পারে না
    • প্রতিস্থাপিত মানটি সেই প্রসঙ্গে আইনী (বা বিযুক্ত) হওয়া দরকার না যেখানে ব্যবহারের প্রতিটি পয়েন্টে এটি নির্ধারণ করা হয়, সুতরাং আপনি এখনও ঘোষিত না হওয়া অবজেক্টগুলিকে উল্লেখ করতে পারেন, "বাস্তবায়ন" এর উপর নির্ভর করতে পারেন যা প্রয়োজন নেই প্রাক-অন্তর্ভুক্ত থাকুন, "কনস্ট্যান্টস" তৈরি করুন যেমন { 1, 2 }অ্যারেগুলি শুরু করতে ব্যবহার করা যেতে পারে, বা #define MICROSECONDS *1E-6ইত্যাদি ( স্পষ্টভাবে এটির প্রস্তাব দিচ্ছে না!)
    • কিছু বিশেষ জিনিষ পছন্দ __FILE__এবং __LINE__ম্যাক্রো প্রতিকল্পন মধ্যে অন্তর্ভুক্ত করা যেতে পারে
    • আপনি #ifশর্তাধীন কোড সহ বিবৃতিতে অস্তিত্ব এবং মানের জন্য পরীক্ষা করতে পারেন (প্রিপ্রসেসর দ্বারা নির্বাচিত না হলে কোডটি সংকলনযোগ্য না হওয়া হিসাবে "যদি" কোডের তুলনায় আরও শক্তিশালী), ব্যবহার #undef-াইন, পুনর্নির্ধারণ ইত্যাদি
    • প্রতিস্থাপন পাঠ্য উন্মোচন করতে হবে:
      • অনুবাদ ইউনিটে এটি ব্যবহার করেছে, যার অর্থ ক্লায়েন্টের ব্যবহারের জন্য লাইব্রেরিতে ম্যাক্রোগুলি অবশ্যই শিরোনামে থাকা উচিত, সুতরাং makeএবং অন্যান্য টাইমস্ট্যাম্প-ভিত্তিক পুনঃসংশোধন সরঞ্জামগুলি ক্লায়েন্টের পুনঃসংশোধনকে ট্রিগার করবে যখন তারা পরিবর্তিত হবে (খারাপ!)
      • বা কমান্ড লাইনে যেখানে ক্লায়েন্ট কোডটি পুনরায় কম্পাইল করা হয়েছে তা নিশ্চিত করার জন্য আরও বেশি যত্ন নেওয়া প্রয়োজন (যেমন সংজ্ঞা সরবরাহকারী মেকফিল বা স্ক্রিপ্টকে নির্ভরতা হিসাবে তালিকাভুক্ত করা উচিত)

আমার ব্যক্তিগত মতামত:

একটি সাধারণ নিয়ম হিসাবে, আমি constগুলি ব্যবহার করি এবং তাদের সাধারণ ব্যবহারের জন্য সবচেয়ে পেশাদার বিকল্প হিসাবে বিবেচনা করি (যদিও অন্যদের মধ্যে এই পুরানো অলস প্রোগ্রামারটির কাছে আবেদন করার সরলতা রয়েছে)।


1
দুর্দান্ত উত্তর। একটি ছোট্ট নীট: আমি মাঝে মাঝে স্থানীয় এনামগুলি ব্যবহার করি যা কোনও শিরোনামে মোটেও শিরোনামে নেই, যেমন ছোট রাষ্ট্রীয় মেশিনগুলিতে এবং এর মতো। সুতরাং তাদের সর্বদা হেডারে থাকতে হবে না।
ক্যারেট

প্রো এবং কনস মিশ্রিত হয়, আমি তুলনা টেবিল দেখতে খুব পছন্দ করব।
অজানা 123

@ অজানা 123: একটি পোস্ট নির্দ্বিধায় - আপনি এখান থেকে উপযুক্ত মনে করেন যে কোনও পয়েন্ট আপনি ছিনিয়ে নিলে আমার আপত্তি নেই। চিয়ার্স
টনি ডেলরয়

48

যদি এটি একটি সি ++ প্রশ্ন এবং এটি #defineবিকল্প হিসাবে উল্লেখ করে তবে এটি "গ্লোবাল" (অর্থাত্ ফাইল-স্কোপ) ধ্রুবক সম্পর্কে, শ্রেণীর সদস্যদের সম্পর্কে নয়। যখন C ++ এ যেমন ধ্রুবক আসে তখন তা static constঅনর্থক। সি ++ এ constডিফল্টরূপে অভ্যন্তরীণ সংযোগ থাকে এবং এগুলি ঘোষণার কোনও অর্থ নেই static। সুতরাং এটি সত্যিই constবনাম সম্পর্কে #define

এবং, অবশেষে, সি ++ constএ ভাল। কমপক্ষে এ ধরণের ধ্রুবকগুলি টাইপ করা এবং স্কোপযুক্ত। কিছু ব্যতিক্রম বাদ দিয়ে #defineবেশি পছন্দ করার কোনও কারণ নেই const

স্ট্রিং কনস্ট্যান্টস, বিটিডাব্লু, যেমন একটি ব্যতিক্রমের একটি উদাহরণ। সঙ্গে #defineঘ স্ট্রিং ধ্রুবক এক হিসেবে, সি / C ++ কম্পাইলার কম্পাইল-টাইম সংযুক্তকরণের বৈশিষ্ট্য ব্যবহার করতে পারেন

#define OUT_NAME "output"
#define LOG_EXT ".log"
#define TEXT_EXT ".txt"

const char *const log_file_name = OUT_NAME LOG_EXT;
const char *const text_file_name = OUT_NAME TEXT_EXT;

পিএস আবার, ঠিক সেই ক্ষেত্রে, যখন কেউ static constবিকল্প হিসাবে উল্লেখ করে #define, এর সাধারণত অর্থ হয় যে তারা সি সম্পর্কে কথা বলছে, সি ++ নিয়ে নয়। আমি এই প্রশ্নটি সঠিকভাবে ট্যাগ করা আছে কিনা তা অবাক ...


1
" কেবলমাত্র # ডিফাইন " পছন্দ করার কোনও কারণ নেই ? স্থির ভেরিয়েবল একটি শিরোনাম ফাইল সংজ্ঞায়িত?
কৌতূহলী

9

#define অপ্রত্যাশিত ফলাফল হতে পারে:

#include <iostream>

#define x 500
#define y x + 5

int z = y * 2;

int main()
{
    std::cout << "y is " << y;
    std::cout << "\nz is " << z;
}

একটি ভুল ফলাফল আউটপুট:

y is 505
z is 510

তবে, আপনি যদি ধ্রুবকগুলির সাথে এটি প্রতিস্থাপন করেন:

#include <iostream>

const int x = 500;
const int y = x + 5;

int z = y * 2;

int main()
{
    std::cout << "y is " << y;
    std::cout << "\nz is " << z;
}

এটি সঠিক ফলাফল প্রকাশ করে:

y is 505
z is 1010

এটি #defineকেবলমাত্র পাঠ্যের পরিবর্তে। যেহেতু এটি করা ক্রিয়াকলাপের ক্রমকে মারাত্মকভাবে বিশৃঙ্খল করতে পারে, আমি তার পরিবর্তে একটি ধ্রুবক পরিবর্তনশীল ব্যবহার করার পরামর্শ দেব।


1
আমার একটি ভিন্ন অপ্রত্যাশিত ফলাফল yছিল : এর মান ছিল 5500, একটি সামান্য-এন্ডিয়ান কনটেন্টেশন xএবং 5
হ্যামার সহ

5

স্ট্যাটিক কনস্ট ব্যবহার করা আপনার কোডে অন্য কোনও কনস্ট ভেরিয়েবল ব্যবহার করার মতো। এর অর্থ আপনি পূর্বের সংকলন প্রক্রিয়ায় কোডটিতে কেবলমাত্র প্রতিস্থাপন করা হবে এমন একটি # নির্দিষ্ট সংখ্যার বিপরীতে তথ্য যেখানেই এসেছে সেগুলি আপনি সনাক্ত করতে পারবেন।

আপনি এই প্রশ্নের জন্য সি ++ এফএকিউ লাইটটি একবার দেখতে চাইতে পারেন: http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.7


4
  • একটি স্ট্যাটিক কনস্ট টাইপ করা হয় (এটিতে একটি টাইপ থাকে) এবং সংযোজক দ্বারা বৈধতা, পুনর্নির্ধারণের জন্য পরীক্ষা করা যায় etc.
  • একটি # ডেফাইনকে যাই হোক না কেন অপরিশোধিত করা যায়।

সাধারণত আপনার স্ট্যাটিক কনসট পছন্দ করা উচিত। এর কোনও অসুবিধা নেই। প্রসেসরটি মূলত শর্তসাপেক্ষ সংকলনের জন্য ব্যবহার করা উচিত (এবং কখনও কখনও সত্যিকারের নোংরা ট্রিক্সের জন্যও)।


3

প্রাক প্রসেসর নির্দেশ ব্যবহার করে ধ্রুবক ডিফাইনিং #defineনা শুধুমাত্র প্রযোজ্য করা বাঞ্ছনীয় নয় C++, কিন্তু এ C। এই ধ্রুবকগুলির ধরণ থাকবে না। এমনকি ইন Cকনস্ট্যান্টগুলির জন্য ব্যবহারের প্রস্তাব দেওয়া হয়েছিল const



2

প্রিপ্রোসেসর জাতীয় কিছু অতিরিক্ত সরঞ্জামের চেয়ে সর্বদা ভাষা বৈশিষ্ট্যগুলি ব্যবহার করতে পছন্দ করুন।

ES.31: ধ্রুবক বা "ফাংশন" এর জন্য ম্যাক্রো ব্যবহার করবেন না

ম্যাক্রোগগুলি বাগের প্রধান উত্স। ম্যাক্রোগুলি সাধারণ স্কোপ এবং টাইপ বিধি মানেন না। যুক্তি পাস করার জন্য ম্যাক্রোগুলি সাধারণ নিয়ম মানেন না। ম্যাক্রোস নিশ্চিত করে যে মানব পাঠক সংকলক যা দেখেন তার থেকে আলাদা কিছু দেখেন। ম্যাক্রোগুলি টুল বিল্ডিং জটিল করে তোলে।

থেকে সি ++ কোর নির্দেশিকা


0

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

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