typeof / typeof_unqual
typeof: اشتقاق نوع من متغيّر موجود typeof / typeof_unqual
typeof يستخرج نوع تعبير أو متغيّر موجود ليستخدمه المترجم مباشرة، مفيد بالماكروهات العامة التي لا تعرف النوع مسبقًا.
typeof (وصيغتها typeof_unqual التي تُسقط const/volatile من النوع الناتج) تسمح بتعريف متغيّر بنفس نوع تعبير آخر دون كتابة اسم ذلك النوع صراحة. كانت هذه الميزة امتدادًا خاصًا بـ GCC وClang لسنوات طويلة قبل أن يُوحّدها معيار C23 رسميًا بين كل المترجمات المتوافقة.
الاستخدام الأشيع هو داخل الماكروهات العامة (macros) حيث تبي كتابة كود يعمل مع أي نوع بيانات دون تكرار تعريف الماكرو لكل نوع على حدة.
الصياغة
typeof(expression) name = value; typeof_unqual(expression) name = value; // بدون const/volatile
📄 مثال
#include <stdio.h>
int main(void) {
int x = 5;
typeof(x) y = 10; // y من نوع int تلقائيًا
printf("%d\n", x + y);
return 0;
}أهم النقاط
| العنصر | الوظيفة |
|---|---|
| typeof(expr) | يحافظ على أي const/volatile موجودة بنوع expr |
| typeof_unqual(expr) | يسقط const/volatile من النوع الناتج |
| الأصل | امتداد GCC/Clang سابقًا، وُحّد رسميًا في معيار C23 |
💡 نصائح عملية
- استخدمه داخل الماكروهات العامة (macros) لتفادي تكرار تعريف نفس المنطق لكل نوع بيانات
- فضّل typeof_unqual لو ما تحتاج الحفاظ على const بالنوع الناتج
⚠️ أخطاء شائعة
- الاعتماد على typeof بمترجم لا يدعم C23 دون فحص التوافق أولًا
- نسيان أن typeof(expr) يحافظ على const، فيسبب تعارضًا لو حاولت تعديل المتغيّر الناتج لاحقًا
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار C الكامل بالعربي.