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

assert

التحقق من الافتراضات وقت التطوير assert

assert توقف البرنامج فورًا برسالة تشخيصية لو كان الشرط الممرَّر خاطئًا — أداة تصحيح أخطاء تُعطَّل تلقائيًا بالإصدار النهائي.

assert من assert.h تفحص شرطًا منطقيًا وقت التشغيل: لو تحقّق (غير صفري) لا يحدث شيء، ولو فشل (صفر) يطبع رسالة تحتوي اسم الملف ورقم السطر والتعبير الذي فشل ثم يستدعي abort() لإنهاء البرنامج فورًا. تُستخدم للتحقق من افتراضات يجب أن تكون صحيحة دائمًا لو كان المنطق سليمًا — مثل مؤشر لا يجب أن يكون NULL بنقطة معيّنة.

تعريف الماكرو NDEBUG قبل تضمين assert.h (غالبًا عبر خيار ترجمة مثل -DNDEBUG) يحوّل كل استدعاءات assert إلى عمليات فارغة (no-op) بالكامل — لذلك لا يجب الاعتماد عليها لتنفيذ منطق فعلي بالبرنامج، فقد لا تُنفَّذ إطلاقًا بالإصدار النهائي.

الصياغة

assert(expression);

📄 مثال

#include <assert.h>

int divide(int a, int b) {
    assert(b != 0);   // يوقف البرنامج فورًا لو b == 0
    return a / b;
}

أهم النقاط

العنصرالوظيفة
assert(cond)يوقف البرنامج برسالة تشخيصية لو كان cond خاطئًا (صفر)
NDEBUGتعريفه قبل assert.h يعطّل كل الـ assert بالكود بالكامل
abort()الدالة التي يستدعيها assert داخليًا عند الفشل

💡 نصائح عملية

  • استخدم assert للتحقق من افتراضات يجب أن تكون صحيحة دائمًا لو الكود سليم، وليس لفحص مدخلات المستخدم
  • لا تضع كودًا له تأثير جانبي ضروري داخل assert — قد يُحذف بالكامل مع NDEBUG

⚠️ أخطاء شائعة

  • الاعتماد على تنفيذ منطق فعلي داخل assert() ثم مفاجأة اختفائه بالإصدار النهائي
  • استخدام assert لفحص مدخلات مستخدم عادية بدل معالجة الخطأ برمجيًا (if + رسالة واضحة)

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار C الكامل بالعربي.