সি 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
হিসাবে এটি পুনরাবৃত্তি হিসাবে বিবেচনা করার কারণ কি ?