تخطَّ إلى المحتوى

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 الكامل بالعربي.