সি 99 স্ট্যান্ডার্ড 6.5.16: 2 এ বলেছে:
একটি অ্যাসাইনমেন্ট অপারেটরের বাম অপরেন্ডের মতো একটি পরিবর্তনযোগ্য লভ্যালু থাকতে হবে।
এবং .3.৩.২.১:1 অনুচ্ছেদে:
একটি পরিবর্তনযোগ্য লভ্যালু এমন একটি মূল্য রয়েছে যা অ্যারের প্রকারের নয়, অসম্পূর্ণ প্রকারের নয়, একটি কনস্ট-কোয়ালিফাইড টাইপ নেই, এবং যদি এটি কাঠামো বা ইউনিয়ন হয় তবে তার কোনও সদস্য নেই (অন্তর্ভুক্ত, পুনরাবৃত্তভাবে, কোনও সদস্য সহ) বা কনস্ট-কোয়ালিটি টাইপ সহ সমস্ত সমন্বিত সমষ্টি বা ইউনিয়নগুলির উপাদান)।
এখন, আসুন const structএকটি constক্ষেত্রবিহীন বিবেচনা করুন।
typedef struct S_s {
const int _a;
} S_t;
মান অনুসারে, নিম্নলিখিত কোডটি অপরিবর্তিত আচরণ (ইউবি):
S_t s1;
S_t s2 = { ._a = 2 };
s1 = s2;
এর সাথে অর্থগত সমস্যাটি হ'ল এনকোলেজিং সত্তা ( struct) সত্তার ঘোষিত ধরণের দ্বারা বিচার করে (কেবল পঠনযোগ্য S_t s1নয়) বিবেচনা করা উচিত, তবে স্ট্যান্ডার্ড (2 টি ধারা) দ্বারা এটি লেখার যোগ্য হিসাবে বিবেচিত হবে না শীর্ষে) constক্ষেত্রের কারণে _a। স্ট্যান্ডার্ড একটি প্রোগ্রামার কোডটি পড়ার জন্য এটি অস্পষ্ট করে তোলে যে এই নিয়োগটি আসলে একটি ইউবি, কারণ যে ডাব্লু / ও struct S_s ... S_tটাইপের সংজ্ঞাটি বলা অসম্ভব ।
তদুপরি, ক্ষেত্রটিতে কেবল পঠনযোগ্য অ্যাক্সেসটি কেবল যেকোন উপায়ে সিন্টেক্সিকভাবে প্রয়োগ করা হয়েছে। constঅ- const structএর কিছু ক্ষেত্র সত্যই কেবল পঠনযোগ্য স্টোরেজে রাখা যাবে না। তবে এই জাতীয় মানের শব্দটি কোডটির বাইরে রয়েছে যা ইচ্ছাকৃতভাবে constএই ক্ষেত্রগুলির অ্যাক্সেসর পদ্ধতিতে ক্ষেত্রগুলির যোগ্যতা দূরে সরিয়ে দেয় , যেমন ( সি এর কাঠামোর ক্ষেত্রগুলিকে যোগ্য করে তোলা ভাল ধারণা? ):
(*)
#include <stdlib.h>
#include <stdio.h>
typedef struct S_s {
const int _a;
} S_t;
S_t *
create_S(void) {
return calloc(sizeof(S_t), 1);
}
void
destroy_S(S_t *s) {
free(s);
}
const int
get_S_a(const S_t *s) {
return s->_a;
}
void
set_S_a(S_t *s, const int a) {
int *a_p = (int *)&s->_a;
*a_p = a;
}
int
main(void) {
S_t s1;
// s1._a = 5; // Error
set_S_a(&s1, 5); // OK
S_t *s2 = create_S();
// s2->_a = 8; // Error
set_S_a(s2, 8); // OK
printf("s1.a == %d\n", get_S_a(&s1));
printf("s2->a == %d\n", get_S_a(s2));
destroy_S(s2);
}
সুতরাং, কোনও কারণে, structপুরোপুরি কেবল পঠনযোগ্য হওয়ার জন্য এটি এটিকে ঘোষণা করার পক্ষে যথেষ্টconst
const S_t s3;
তবে সামগ্রিকভাবে structকেবল অ-পঠনযোগ্য হওয়ার জন্য এটি ডাব্লু / ও ও ঘোষণা করার পক্ষে যথেষ্ট নয় const।
আমার মনে হয় যা আরও ভাল হবে তা হ'ল:
- ক্ষেত্রগুলি
constসহ অ- কাঠামো তৈরিতে সীমাবদ্ধ করা এবংconstএ জাতীয় ক্ষেত্রে ডায়াগনস্টিক জারি করা। এটি পরিষ্কার করে দেবে যেstructকেবলমাত্র পঠনযোগ্য ক্ষেত্রগুলি কেবল পঠনযোগ্য সেগুলি । - উপরের কোডটি * (*) স্ট্যান্ডার্ডের সাথে সঙ্গতিপূর্ণ করে তুলতে
constনন-constস্ট্রাক্টের সাথে সম্পর্কিত কোনও ক্ষেত্রে লেখার ক্ষেত্রে আচরণের সংজ্ঞা দেওয়া ।
অন্যথায় আচরণটি সামঞ্জস্যপূর্ণ এবং বোঝা শক্ত নয়।
সুতরাং, সি স্ট্যান্ডার্ডটি কারণ constহিসাবে এটি পুনরাবৃত্তি হিসাবে বিবেচনা করার কারণ কি ?