ومتى ما هي الأغراض التي يجب أن الكلمة const أن تستخدم في ج عن المتغيرات ؟

softwareengineering.stackexchange https://softwareengineering.stackexchange.com/questions/204500

سؤال

في حين الحصول على قانون بلدي استعرض هنا مسألة استخدام 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى softwareengineering.stackexchange
scroll top