constexpr
constexpr: ثوابت مضمونة وقت الترجمة constexpr
constexpr في C23 يعرّف متغيّرًا ثابتًا بنوع حقيقي يفحصه المترجم، وقيمته مضمونة أنها تُحسب بالكامل وقت الترجمة لا وقت التشغيل.
قبل C23 كان لديك خياران للثوابت: #define (استبدال نصّي بلا نوع ولا فحص من المترجم) أو const (متغيّر بنوع، لكن قيمته قد تُهيّأ من تعبير يُحسب وقت التشغيل). constexpr يجمع مزايا الاثنين: نوع حقيقي يفحصه المترجم، مع ضمان أن القيمة تُحسب بالكامل وقت الترجمة من تعبير ثابت (constant expression).
نسخة constexpr في C23 أكثر محدودية من نظيرتها في C++: تُطبَّق فقط على متغيّرات (لا توجد دوال constexpr في C كما في C++)، والقيمة يجب أن تكون قابلة للحساب الكامل وقت الترجمة.
الصياغة
constexpr Type name = constant_expression;
📄 مثال
#include <stdio.h>
int main(void) {
constexpr int maxUsers = 100;
constexpr double pi = 3.14159;
int arr[maxUsers]; // صالح: maxUsers معروف وقت الترجمة
printf("%d %f\n", maxUsers, pi);
return 0;
}أهم النقاط
| العنصر | الوظيفة |
|---|---|
| constexpr على متغيّرات فقط | بعكس C++، لا توجد دوال constexpr في C23 |
| يحتاج تعبير ثابت | القيمة يجب أن تُحسب بالكامل وقت الترجمة |
| له نوع حقيقي | بعكس #define الذي هو مجرّد استبدال نصّي بلا نوع |
💡 نصائح عملية
- استخدم constexpr بدل #define للثوابت الرقمية الجديدة — تحصل على فحص نوع فعلي من المترجم
- استخدمه لأحجام مصفوفات ثابتة تحتاج قيمة معروفة وقت الترجمة
⚠️ أخطاء شائعة
- محاولة تهيئة constexpr بقيمة تعتمد على مدخل أو دالة تُنفّذ وقت التشغيل — خطأ ترجمة
- توقّع دوال constexpr كما في C++ — لا وجود لها في معيار C23
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار C الكامل بالعربي.