Mohssen A Mohssen نشر 28 نوفمبر 2021 أرسل تقرير نشر 28 نوفمبر 2021 تعلمت أن كل الثوابت من نوع constexpr يتم تهيئتها وخزين قيمتها أثناء وقت التصريف compile time، لذلك لما لا نقوم بإستعمال define# بدلًا من ذلك، حيث أن أستعمالها أسهل ولا نحتاج إلى تعريف نوع type للثابت؟ #define MAX_STUDENTS_PER_CLASS 30 int max_students { numClassrooms * MAX_STUDENTS_PER_CLASS }; ما الفرق بين define# و constexpr؟ 1 اقتباس
1 سامح أشرف نشر 28 نوفمبر 2021 أرسل تقرير نشر 28 نوفمبر 2021 عندما تستخدم موجهة 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 لتفادي الأخظاء السابقة. 1 اقتباس
السؤال
Mohssen A Mohssen
تعلمت أن كل الثوابت من نوع constexpr يتم تهيئتها وخزين قيمتها أثناء وقت التصريف compile time، لذلك لما لا نقوم بإستعمال define# بدلًا من ذلك، حيث أن أستعمالها أسهل ولا نحتاج إلى تعريف نوع type للثابت؟
ما الفرق بين define# و constexpr؟
1 جواب على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.