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