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

[[attribute]]

السمات المعيارية: deprecated وmaybe_unused وnodiscard وfallthrough [[attribute]]

C23 يوحّد سمات [[...]] بين كل المترجمات بدل امتدادات GCC/Clang الخاصة — تحذيرات ترجمة أوضح دون تغيير سلوك البرنامج.

لسنوات طويلة استخدمت مشاريع C امتدادات خاصة بكل مترجم (مثل __attribute__((deprecated)) بـ GCC) لإعطاء المترجم تلميحات إضافية عن الكود دون التأثير على سلوكه وقت التشغيل. C23 يوحّد أهم هذه التلميحات كسمات معيارية بصيغة [[...]] تعمل بنفس الطريقة على أي مترجم متوافق.

أبرزها أربعة: [[deprecated]] يحذّر عند استخدام دالة أو نوع قديم يُفضَّل تجنّبه، [[maybe_unused]] يمنع تحذير 'متغيّر غير مستخدم' لعنصر قد لا يُستخدم بكل المسارات، [[nodiscard]] يحذّر لو تجاهلت القيمة المُرجعة من دالة، و[[fallthrough]] يوضّح أن الانزلاق بين حالتَي switch متعمّد وليس نسيانًا لـ break.

الصياغة

[[deprecated("reason")]] ReturnType func(...);
[[maybe_unused]] Type var;
[[nodiscard]] ReturnType func(...);
case X: stmt; [[fallthrough]];

📄 مثال

#include <stdio.h>

[[nodiscard]] int mustCheck(void) { return 42; }

int main(void) {
    int x = 1;
    switch (x) {
        case 1:
            printf("واحد\n");
            [[fallthrough]];
        case 2:
            printf("أو اثنين\n");
            break;
    }
    int v = mustCheck();   // لو تجاهلت القيمة، المترجم يحذّر
    printf("%d\n", v);
    return 0;
}

أهم النقاط

العنصرالوظيفة
[[deprecated("...")]]تحذير عند استدعاء دالة أو استخدام نوع يُنصح بتجنّبه
[[maybe_unused]]يمنع تحذير 'غير مستخدم' لمتغيّر أو معامل متعمّد عدم استخدامه دائمًا
[[nodiscard]]تحذير عند تجاهل القيمة المُرجعة من دالة — مفيد لدوال يجب فحص نتيجتها
[[fallthrough]]يوضّح انزلاقًا متعمّدًا بين حالتَي switch، لا نسيان break

💡 نصائح عملية

  • ضع [[nodiscard]] على دوالك التي تُرجع نتيجة يجب فحصها (مثل نجاح/فشل عملية)
  • استخدم [[fallthrough]] بدل ترك تعليق //fallthrough — المترجم يفهمها فعليًا ويتوقف عن التحذير

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

  • افتراض أن هذه السمات تُغيّر سلوك البرنامج وقت التشغيل — هي فقط تلميحات وقت الترجمة
  • الاعتماد عليها بمترجم لا يدعم C23 دون فحص التوافق، أو الخلط بينها وبين __attribute__ الخاصة بـ GCC

خصائص ذات صلة

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