اذهب إلى المحتوى
  • 0

لماذا لا نستعمل define# بدلًا من constexpr في لغة ++C؟

Mohssen A Mohssen

السؤال

تعلمت أن كل الثوابت من نوع constexpr يتم تهيئتها وخزين قيمتها أثناء وقت التصريف compile time، لذلك لما لا نقوم بإستعمال define# بدلًا من ذلك، حيث أن أستعمالها أسهل ولا نحتاج إلى تعريف نوع type للثابت؟

#define MAX_STUDENTS_PER_CLASS 30
int max_students { numClassrooms * MAX_STUDENTS_PER_CLASS };

ما الفرق بين define# و constexpr؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

عندما تستخدم موجهة Preprocessor Directive مثل define لتعريف قيمة ثابته مثل MAX_STUDENTS_PER_CLASS  فإن هذه القيمة يتم إسبدالها في كل مكان في الملف وستكون النتيجة كالتالي:

int max_students { numClassrooms * 30 };

ولكن هذه الطريقة لها العديد من المشاكل، حيث أن الـ Preprocessor لا يفهم صيغة ++C على الإطلاق ويقوم بإستبدال الثابت MAX_STUDENTS_PER_CLASS بالقيمة 30 في كل مكان يجده في الملف بغض النظر عن أي مجال Scope تكون فيه، وبالتالي قد تجد أن القيمة 30 أصبحت في أماكن غير مرغوب فيها مما يسبب بعض الأخطاء أثناء عملية التصريف Compiling.

وبما أن الثابت MAX_STUDENTS_PER_CLASS يتم إستبدال قيمته قبل عملية التصريف من قِبل الـ Preprocessor فلا يمكن تتبع هذه القيمة من خلال مصحح الأخطاء debugger الموجود في بيئة التطوير لديك، وبالتالي لا يفضل أن يتم إستعمال هذه الطريقة لأنها قد تعرضك إلى أخطاء منطقية Logical Errors والتي يصعب إكتشاف سببها وحلها.

أيضًا قد يتعارض تعريف القيمة من خلال Preprocessor Directive مع الكود نفسه، فعلى سبيل المثال في الكود التالي سوف يتم إزالة كل كلمات beta وإستدالها بالقيمة 3:

#define beta 3
#include <iostream>

int main()
{
    int beta{ 5 };
    std::cout << beta;

    return 0;
}

سوف يقوم الـ Preprocessor بتحويل الكود السابق إلى التالي:

#include <iostream>

int main()
{
    int 3{ 5 };
    std::cout << 3;

    return 0;
}

لاحظ كيف تم تغير اسم المتغير beta في السطر 5 إلى القيمة 3، وفي بعض الأحيان قد يتم تعريف القيمة beta في ملف آخر مما يجعل من عملية إكتشاف سبب هذه المشكلة صعبًا.

وبناءً على ما سبق يفضل إستعمال const أو contexpr بدلًا من define لتفادي الأخظاء السابقة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...