ভেরিয়েবলের জন্য কনটেস্ট কীওয়ার্ডটি কখন এবং কোন উদ্দেশ্যে ব্যবহার করা উচিত?


58

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

আমি যখন বিবিধ পরিস্থিতিগুলি কার্যকর হতে পারি তখন সেগুলি সম্পর্কে আমি বিভ্রান্ত।

  • এটি ফাংশন প্রোটোটাইপগুলিতে স্বচ্ছতার খাতিরে ব্যবহার করা উচিত?
  • কোড বিকাশের সময় এটি কী সুরক্ষা পরিমাপ হিসাবে ব্যবহার করা উচিত?
  • রান-টাইম কনস্ট্যান্ট ঘোষণার জন্য এটিকে বিভিন্ন ফাংশনের সুযোগে ব্যবহার করা উচিত?
  • এটি কি আদৌ ব্যবহার করা উচিত?

এই প্রশ্নটি আমি যে বিভ্রান্তির মুখোমুখি হচ্ছি তার উদাহরণ মাত্র। সাধারণ বিভ্রান্তি হয়

  • constসি প্রোগ্রামিংয়ে কীওয়ার্ডটি ব্যবহার করা উচিত ?
  • সিতে এই কীওয়ার্ডটি ব্যবহার করে বিভিন্ন ধরণের সুবিধা কী কী উপকার পাবেন?
  • constকীওয়ার্ড ব্যবহার করার কোনও বিধান আছে ?


এটা উল্লেখ করা হয়েছে যে এই প্রশ্নটি আমার প্রশ্নের বিশদটিতে এই সমস্ত প্রশ্নের কারণে খুব বিস্তৃত হতে পারে। আমি কেবল স্পষ্ট করে বলতে চেয়েছিলাম যে এই প্রশ্নগুলি কেবল মূল প্রশ্নটি সম্পর্কে বিভ্রান্তি স্পষ্ট করার জন্য।

ভেরিয়েবলের জন্য কনটেস্ট কীওয়ার্ডটি কখন এবং কোন উদ্দেশ্যে ব্যবহার করা উচিত?

এটি হিসাবে পুনঃব্যবস্থা করা যেতে পারে

constসি এর মধ্যে কী-ওয়ার্ডের যথাযথ ব্যবহারের সমতুল্য এবং বিপরীতে।


ভোটদানকারীদের জন্য এটি বন্ধ হওয়ার জন্য দয়া করে ব্যাখ্যা করুন কেন এটি বিভাগের অধীনে আসে না Specific issues with software development। আমি বেশ নির্দিষ্ট করা হচ্ছে।
অসীম বানসাল

আমি এটি অনুমান করছি কারণ আপনি একই পোস্টে একাধিক প্রশ্ন জিজ্ঞাসা করেছেন, এবং তাই আপনার প্রশ্নটি খুব সম্প্রচারের
রবার্ট হার্ভে

1
@ রবার্টহারভে এই সমস্ত প্রশ্ন কেবল আমার বিভ্রান্তি ব্যাখ্যা করার জন্য। আমার একমাত্র প্রশ্ন এই প্রশ্নের শিরোনাম রয়ে গেছে। এটির একটি ভাল উত্তর সম্পর্কিত এই সমস্ত প্রশ্নকে কভার করবে। সুতরাং এটি একটি specific issueconstসি এর মধ্যে কী-ওয়ার্ডের যথাযথ ব্যবহারের সমতুল্য এবং বিপরীতে।
অসীম বানসাল

নিবন্ধন করুন
অসীম বানসাল

উত্তর:


64

কোড পর্যালোচনা করার সময়, আমি নিম্নলিখিত নিয়মগুলি প্রয়োগ করি:

  • সর্বদা constরেফারেন্স দ্বারা পাস ফাংশন পরামিতিগুলির জন্য ব্যবহার করুন যেখানে ফাংশনটি নির্দেশিত ডেটা সংশোধন করে না (বা বিনামূল্যে)।

    int find(const int *data, size_t size, int value);
  • সবসময় constধ্রুবকগুলির জন্য ব্যবহার করুন যা অন্যথায় একটি # নির্দিষ্ট বা এনুম ব্যবহার করে সংজ্ঞায়িত করা যেতে পারে। সংকলক ফলস্বরূপ পঠনযোগ্য মেমরি (ROM) এ ডেটা সনাক্ত করতে পারে (যদিও লিঙ্কার এম্বেডড সিস্টেমে প্রায়শই এই উদ্দেশ্যে আরও ভাল সরঞ্জাম হয়)।

    const double PI = 3.14;
  • মান দ্বারা পাস হওয়া প্যারামিটারের জন্য কোনও ফাংশন প্রোটোটাইপে কখনও কনস্ট ব্যবহার করবেন না । এর কোনও অর্থ নেই এবং তাই কেবল 'আওয়াজ'।

    // don't add const to 'value' or 'size'
    int find(const int *data, size_t size, const int value); 
    
  • উপযুক্ত যেখানে, const volatileঅবস্থানগুলি ব্যবহার করুন যা প্রোগ্রাম দ্বারা পরিবর্তন করা যায় না তবে এখনও পরিবর্তিত হতে পারে। হার্ডওয়্যার রেজিস্ট্রারগুলি এখানে সাধারণ ব্যবহারের কেস, উদাহরণস্বরূপ এমন একটি স্ট্যাটাস রেজিস্টার যা কোনও ডিভাইসের রাজ্যকে প্রতিফলিত করে:

    const volatile int32_t *DEVICE_STATUS =  (int32_t*) 0x100;

অন্যান্য ব্যবহারগুলি alচ্ছিক। উদাহরণস্বরূপ, ফাংশন বাস্তবায়নের মধ্যে কোনও ফাংশনের পরামিতিগুলি কনস্ট হিসাবে চিহ্নিত করা যেতে পারে।

// 'value' and 'size can be marked as const here
int find(const int *data, const size_t size, const int value)  
{
     ... etc

বা ফাংশন রিটার্ন মান বা গণনাগুলি প্রাপ্ত হয় এবং তারপরে কখনই পরিবর্তন হয় না:

char *repeat_str(const char *str, size_t n) 
{
    const size_t len = strlen(str);
    const size_t buf_size = 1 + (len * n);
    char *buf = malloc(buf_size);
    ...

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


সমস্যা const। আপনি সম্ভবত "কনস্টেটিভ বিষ" শব্দটি শুনবেন। constকোনও ফাংশন প্যারামিটারে যুক্ত হওয়ার পরে এটি প্রচার করতে 'স্থিরতা' সৃষ্টি করে occurs

সম্পাদনা করুন - কনস্টের বিষ: উদাহরণস্বরূপ ফাংশনে:

int function_a(char * str, int n)
{
    ...
    function_b(str);
    ...
}

যদি আমরা পরিবর্তিত strহয় const, আমাদের অবশ্যই এটি fuction_bঅবশ্যই গ্রহণ করবে তা নিশ্চিত করতে হবে const। এবং তাই উপর যদি function_bপাস strকরতে function_c, ইত্যাদি আপনি কল্পনা করতে পারেন এই বেদনাদায়ক হতে পারে যদি এটি অনেক পৃথক ফাইল / মডিউল মধ্যে propagates। যদি এটি এমন কোনও ফাংশনে প্রচার করে যা পরিবর্তন করা যায় না (যেমন সিস্টেম লাইব্রেরি), তবে একটি কাস্ট প্রয়োজনীয় হয়ে যায়। সুতরাং constবিদ্যমান কোডে চারপাশে ছিটানো সম্ভবত সমস্যার জন্য জিজ্ঞাসা করছে। যদিও নতুন কোডে, constযেখানে উপযুক্ত সেখানে ধারাবাহিকভাবে যোগ্যতা অর্জন করা ভাল ।

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

const char str[] = "hello world\n";
char *s = strchr(str, '\n');
*s = '\0';

strchrএকটি char*না একটি প্রদান const char*। এর কল প্যারামিটার হিসাবে constএটি অবশ্যই কল প্যারামিটারটি cast ালাই করতে পারে char*। এবং এই ক্ষেত্রে আসল পঠনযোগ্য স্টোরেজ সম্পত্তি কেড়ে দেয়। সম্পাদনা করুন: - এটি সাধারণত পঠনযোগ্য মেমরিটিতে ভারসের ক্ষেত্রে প্রযোজ্য। 'রম' দ্বারা, আমি কেবল শারীরিক রমকেই বোঝাতে চাইছি না তবে কোনও রচনা-সুরক্ষিত কোনও মেমরি যেমন একটি সাধারণ ওএসে চালিত প্রোগ্রামগুলির কোড বিভাগে ঘটে।

অনেকগুলি স্ট্যান্ডার্ড গ্রন্থাগার ফাংশন একইভাবে আচরণ করে, তাই সাবধান হন: যখন আপনার আসল ধ্রুবক থাকে (যেমন রমগুলিতে সঞ্চিত থাকে) আপনার অবশ্যই তাদের দৃ careful়তা হারাতে না দেওয়ার জন্য খুব সতর্ক থাকতে হবে।


এর আসলে দুটি অর্থ নেই two এটির অর্থ কেবল, যেমন আপনি বলেছেন, " আমি এটি পরিবর্তন করব না to" উদাহরণস্বরূপ, এটি একটি const volatileপরিবর্তনশীল থাকা পুরোপুরি বৈধ ।
স্পষ্টত 15

2
এটি ফাংশন প্যারামিটারগুলির ক্ষেত্রে সত্য তবে ফাইল স্কোপগুলির ধ্রুবকগুলির জন্য উদাহরণস্বরূপ, একটি constভেরিয়েবলটি কেবল পঠনযোগ্য: যা constবলে "এটি সংশোধন করা যায় না "। const volatileঅন্যদিকে A বলছেন "এটি সংশোধন করা যায় না , তবে এটি পরিবর্তন হতে পারে"। আমি আমার উত্তরে অস্থিরতার একটি উল্লেখ যুক্ত করব।
উইলিয়াম মরিস

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

আপনি ঠিক বলেছেন, "এটি রোমে রাখুন" অসম্পূর্ণ (যদিও সংহত :-) - আমি এটিকে "এটি সংশোধন করা যায় না" - এ পরিবর্তন করব যা আরও সঠিক accurate তোমার মন্তব্যের জন্য ধন্যবাদ.
উইলিয়াম মরিস

এটি একটি দুর্দান্ত ওভারভিউ। আমি ফ্রেজ করতে চান এটা যে constঘোষণা উভয় শুধুমাত্র পাঠযোগ্য তথ্য এবং শুধুমাত্র পাঠযোগ্য মতামত হচ্ছে "এই পরিবর্তন করা যায় না" বনাম "এই সংশোধন করতে পারবেন না" ডেটা-পার্থক্য।
জন পুর্ডি

8

সাধারণত যে কোনও প্রোগ্রামিং ভাষায় এটি ব্যবহারের জন্য প্রস্তাবিত constবা সমতুল্য সংশোধক

  • এটি কলারের কাছে স্পষ্ট করে দিতে পারে যে তারা যা করেছে তাতে কোনও পরিবর্তন হবে না
  • সংকলক নির্দিষ্টরূপে জানার পর থেকে সম্ভাব্য গতির উন্নতিগুলি প্যারামিটারটি পরিবর্তন করতে পারে তবে কেবলমাত্র প্রাসঙ্গিক এমন কিছু জিনিস বাদ দিতে পারে
  • নিজের থেকে সুরক্ষা দুর্ঘটনাক্রমে মান পরিবর্তন করে

1

হ্যাঁ, এটি মূলত TheLQ এর উত্তর।

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

আমি সাধারণত যা দেখেছি, এটি বেশিরভাগ কোডে ধ্রুবক মান যুক্ত করতে ব্যবহৃত হয় এবং আপনি নির্দিষ্ট ফাংশনটি কল করলে অ্যারে বা কাঠামোটি পরিবর্তন করা হবে না তা বোঝাতে ব্যবহৃত হয়। এই শেষ অংশটি গুরুত্বপূর্ণ, কারণ আপনি যখন কোনও ফাংশনটি কল করেন যা আপনার অ্যারে বা কাঠামোটি সংশোধন করবে, আপনি মূল সংস্করণটি রাখতে চাইতে পারেন, সুতরাং আপনি ভেরিয়েবলের একটি অনুলিপি তৈরি করে ফাংশনে পাস করতে পারেন to যদি এটি না হয়, আপনার অবশ্যই অনুলিপিটির প্রয়োজন নেই, সুতরাং উদাহরণস্বরূপ আপনি পরিবর্তন করতে পারেন,

int foo(Structure s);

প্রতি

int foo(const Structure * s);

এবং অনুলিপি অনুলিপি না পেয়ে।

কেবল যোগ করার জন্য, দ্রষ্টব্য যে সি এর কনস্টেপ স্পেসিফায়ারের সাথে নির্দিষ্ট বিধি রয়েছে। উদাহরণ স্বরূপ,

int b = 1;
const int * a = &b;

যেমন হয় না

int b = 1;
int * const a = &b;

প্রথম কোড আপনাকে একটিটি সংশোধন করার অনুমতি দেবে না। দ্বিতীয় ক্ষেত্রে, পয়েন্টারটি স্থির থাকে তবে এর বিষয়বস্তুটি নয়, তাই সংকলক আপনাকে * a = 3;সংকলক ত্রুটি ছাড়াই বলতে দেবে , তবে আপনি aঅন্য কোনও বিষয়ের উল্লেখ হতে পারবেন না ।


0

TheLQ এর বক্তব্যের সাথে একমত:

প্রোগ্রামারদের একটি দলের সাথে কাজ করার সময় ঘোষনা constকরা ইঙ্গিত দেওয়ার একটি ভাল উপায় যা বলেছিল যে পরিবর্তনশীল পরিবর্তন করা উচিত নয়, বা কেবলমাত্র বড় প্রকল্পগুলিতে নিজেকে স্মরণ করিয়ে দেওয়ার জন্য। এটি সেই অর্থে কার্যকর এবং অনেক মাথাব্যথা বাঁচাতে পারে।

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