ومتى ما هي الأغراض التي يجب أن الكلمة const أن تستخدم في ج عن المتغيرات ؟
https://softwareengineering.stackexchange.com/questions/204500
-
29-09-2020 - |
سؤال
في حين الحصول على قانون بلدي استعرض هنا مسألة استخدام const
الكلمة جاء.أنا أفهم أن يتم استخدامه لتنفيذ للقراءة فقط على سلوك المتغيرات.
أنا في حيرة حول ما هي مختلف الحالات عندما يمكن أن تكون مفيدة.
- ينبغي أن تستخدم من أجل التوضيح في وظيفة النماذج ؟
- ينبغي أن تستخدم كإجراء أمني خلال مدونة التنمية ؟
- ينبغي أن تستخدم في نطاق مختلف وظائف معلنا وقت التشغيل الثوابت?
- ينبغي أن تستخدم في كل شيء ؟
هذه المسألة هي مجرد أمثلة من الارتباك التي أواجهها.الارتباك العام هو
- عندما ينبغي أن يكون
const
الكلمات الرئيسية المستخدمة في البرمجة C? - ما هي أنواع مختلفة من الفوائد التي يمكن الحصول عليها باستخدام هذه الكلمات الرئيسية في C ؟
- هل هناك أي سلبيات استخدام
const
الكلمة ؟
وقد أشار إلى أن هذا السؤال قد تكون واسعة جدا بسبب كل هذه الأسئلة في التفاصيل من سؤالي.أردت فقط أن أوضح أن هذه الأسئلة هي فقط لتوضيح الالتباس فيما يتعلق السؤال الرئيسي.
ومتى ما هي الأغراض التي يجب أن الكلمة const أن تستخدم في ج عن المتغيرات ؟
فإنه يمكن أيضا أن تكون صياغتها على النحو
الاستخدام السليم
const
الكلمة الرئيسية في C` مع إيجابيات وسلبيات نفسه.
المحلول
عند استعراض الكود تطبيق القواعد التالية:
دائما استخدام
const
عن وظيفة المعلمات التي تم تمريرها من قبل المرجعية حيث وظيفة لا تعديل (أو مجانا) البيانات إلى.int find(const int *data, size_t size, int value);
دائما استخدام
const
عن الثوابت التي قد تكون محددة باستخدام رقم تعريف أو التعداد.المترجم يمكن تحديد موقع البيانات في ذاكرة القراءة فقط (ROM) نتيجة (على الرغم من أن الرابط هو في كثير من الأحيان أفضل أداة لهذا الغرض في النظم المضمنة).const double PI = 3.14;
أبدا استخدام const في وظيفة النموذج بالنسبة معلمة مرت القيمة.ليس له معنى و هو بالتالي مجرد 'الضجيج'.
// don't add const to 'value' or 'size' int find(const int *data, size_t size, int value);
عند الاقتضاء, استخدام
const volatile
على المواقع التي لا يمكن تغييرها من قبل البرنامج ولكن قد تتغير.سجلات الأجهزة هي حالة استخدام النموذجية هنا ، على سبيل المثال حالة تسجيل يعكس حالة الجهاز:const volatile int32_t *DEVICE_STATUS = (int32_t*) 0x100;
الاستخدامات الأخرى اختيارية.على سبيل المثال, المعلمات إلى وظيفة من خلال وظيفة تنفيذ يمكن أن تكون علامة const.
// '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 خط مشفرة كثيفة وظيفة مع حلقات متداخلة كثيرة طويلة
أو مماثلة أسماء المتغيرات ، مع العلم أن بعض المتغيرات قد لا تتغير أبدا
سهولة understaning بشكل ملحوظ.هذه الوظائف مصممة بشكل سيئ أو
maintened.
مشاكل مع const
.ربما كنت سوف نسمع مصطلح "const التسمم".هذا يحدث عند إضافة const
إلى وظيفة معلمة الأسباب 'constness إلى
للنشر.
تحرير - const التسمم:على سبيل المثال من خلال وظيفة:
int function_a(char * str, int n)
{
...
function_b(str);
...
}
إذا قمنا بتغيير str
إلى const
, نحن يجب أن تضمن fuction_b
كما يأخذ
a const
.وذلك إذا كان function_b
يمر str
على أن function_c
,
الخ.كما يمكنك أن تتخيل أن هذا يمكن أن تكون مؤلمة إذا كانت تنتشر في العديد من
ملفات منفصلة/وحدات.إذا كان يدعو إلى وظيفة لا يمكن
تغيير (على سبيل المثال نظام المكتبة) ، ثم يلقي يصبح من الضروري.حتى رش
const
حول التعليمات البرمجية الموجودة ربما يسأل عن المتاعب.في القانون الجديد
على الرغم من أنه هو الأفضل const
التأهل باستمرار عند الاقتضاء.
أكثر غدرا مشكلة const
هو أنه لم يكن في الأصل
اللغة.كما إضافة على أنها لا تناسب تماما.لبداية له معنيان
(كما في القواعد أعلاه ، معنى "أنا لا أذهب إلى تغيير هذا" و "هذا لا يمكن تعديل").بل أكثر من ذلك, يمكن أن تكون خطيرة.على سبيل المثال, وتجميع
تشغيل هذه التعليمات البرمجية و (تبعا مترجم/الخيارات) قد تحطم عند
تشغيل:
const char str[] = "hello world\n";
char *s = strchr(str, '\n');
*s = '\0';
strchr
ترجع char*
لا const char*
.كما دعوته المعلمة
const
يجب أن الزهر الدعوة إلى المعلمة char*
.و في هذه الحالة أن
يلقي بعيدا الحقيقي للقراءة فقط تخزين الممتلكات. تحرير:- هذا ينطبق عموما على فأر في ذاكرة القراءة فقط.بواسطة 'ROM', أعني ليس المادي فقط ROM ولكن أي الذاكرة محمي ضد الكتابة, كما يحدث رمز القسم من برامج تشغيل نموذجي نظام التشغيل.
العديد من المكتبة القياسية وظائف تتصرف بنفس الطريقة ، لذلك حذار:عند لديك الحقيقي الثوابت (ie.المخزنة في ROM) يجب أن تكون حذرا جدا عدم تفقد constness.
نصائح أخرى
Generally in any programming language its recommended to use const
or the equivalent modifier since
- It can clarify to the caller that what they passed in is not going to change
- Potential speed improvements since the compiler knows for certain it can omit certain things that are only relevant if the parameter can change
- Protection from yourself accidentally changing the value
In agreement with TheLQ's statements:
When working with a team of programmers declaring const
is a good way of indicating that said variable shouldn't be modified, or just for reminding yourself in large projects. It's useful in that sense, and can save many headaches.
Yes, it's basically the TheLQ's answer.
Is a security measure for the programmer so you don't modify a variable, and to not call functions that may modify them. In an array or structure the const specifier indicates that the values of their contents won't be modified, and even the compiler will not allow you to do so. You still can easily change the value of the variable with just a cast however.
In what I have usually see, it's mostly used to add constant values in code, and to indicate that the array or structure won't be modified if you call a particular function. This last part is important, because when you call a function that WILL modify your array or structure, you may want to keep the original version, so you create a copy of the variable and then pass it to function. If that is not the case, you don't require the copy, obviously, so for example you can change,
int foo(Structure s);
to
int foo(const Structure * s);
and not getting the copy overhead.
Just to add, note that C has particular rules with the const specifier. For example,
int b = 1;
const int * a = &b;
is not the same as
int b = 1;
int * const a = &b;
The first code won't allow you to modify a. In the second case, the pointer is constant but its contents is not, so the compiler will allow you to say * a = 3;
without a compiler error, but you can't make a
to be a reference to another thing.