c++ - ماذا يفعل ماكرو Q_OBJECT؟ لماذا تحتاج كل كائنات كيو تي إلى هذا الماكرو؟




qt macros (5)

يجب أن يظهر الماكرو Q_OBJECT في القسم الخاص من تعريف الفئة الذي يحدد إشاراته وفتحاته الخاصة أو التي تستخدم خدمات أخرى يوفرها نظام كائن meta في كيو تي.

لقد بدأت للتو باستخدام كيو تي ولاحظت أن كل تعريفات فئة المثال لها الماكرو Q_OBJECT الأول. ما هو الغرض من هذا الماكرو preprocessor؟


من وثائق كيو تي :

Meta-Object Compiler ، moc ، هو البرنامج الذي يعالج ملحقات C ++ في Qt.

أداة moc يقرأ ملف رأس C ++. إذا عثر على واحد أو أكثر من تعريفات فئة تحتوي على الماكرو Q_OBJECT ، فإنه ينتج عن ملف مصدر C ++ يحتوي على رمز كائن meta لهذه الفئات. من بين الأشياء الأخرى ، مطلوب رمز كائن meta لآلية الإشارات والفتحات ، ومعلومات نوع وقت التشغيل ، ونظام الخصائص الديناميكية.


تحويل MOC (برنامج التحويل البرمجي كائن meta) في Q_OBJECT الماكرو تضمين ملفات رأس في التعليمات البرمجية المصدر المكافئ C ++. يتحكم بشكل أساسي في آلية فتحة الإشارة ، ويجعلها مفهومة لمترجم C ++


إنه ببساطة يخبر المترجم المسبق أن هذا الصنف يحتوي على عناصر واجهة المستخدم ويحتاج إلى أن يتم تشغيله من خلال 'moc' تحتاج فقط إلى إضافة هذا إلى الفئات التي تستخدم آلية الإشارة / الفتحة.
ولكن سيتم تجاهلها بهدوء في أي فصول أخرى - إنها تضيف فقط إلى وقت البناء.


لبعض الأسباب لا أستطيع التعليق على الإجابة الأولى ...

أظهر البعض منكم وحدات ماكرو ذات متغيرات محلية ، لكن لم يذكر أحد أنه لا يمكنك استخدام أي اسم في الماكرو! وسوف يعض المستخدم في يوم من الايام! لماذا ا؟ لأنه يتم استبدال وسائط الإدخال في قالب الماكرو الخاص بك. وفي الأمثلة الماكرو الخاصة بك كنت تستخدم اسم المتغير الأكثر استخداما على الأرجح أنا .

على سبيل المثال عندما الماكرو التالي

#define FOO(X) do { int i; for (i = 0; i < (X); ++i) do_something(i); } while (0)

يستخدم في الوظيفة التالية

void some_func(void) {
    int i;
    for (i = 0; i < 10; ++i)
        FOO(i);
}

لن يستخدم الماكرو المتغير المقصود i ، التي يتم تعريفها في بداية some_func ، ولكن المتغير المحلي ، الذي تم التصريح به في حالة ... أثناء حلقة الماكرو.

وبالتالي ، لا تستخدم أبداً أسماء المتغيرات الشائعة في الماكرو!





c++ qt macros