سؤال

لقد حصلت على بعض الهياكل لتهيئة ، والتي ستكون مملة للقيام يدويا.أود إنشاء ماكرو من شأنها أن تساعدني في ذلك...لكنني لست متأكدا من C المعالج هو جيد بما فيه الكفاية لهذا الغرض.

لقد حصلت على الهياكل التي تمثل القوائم.وهي تتكون من مؤشرات وظيفة فقط:

typedef uint8_t (*button_handler) (uint8_t);
typedef void (*pedal_handler) (void);
typedef void (*display_handler) (void);
typedef void (*menu_switch_handler) (void);

#define ON_BUTTON(x) uint8_t menu_frame_##x##_button (uint8_t button)
#define ON_PEDAL(x) void menu_frame_##x##_pedal (void)
#define ON_DISPLAY(x) void menu_frame_##x##_display (void)
#define ON_SWITCH(x) void menu_frame_##x##_switch (void)

typedef struct menu_frame {
   button_handler on_button;
   pedal_handler on_pedal;
   display_handler on_display;
   menu_switch_handler on_switch;
} menu_frame;

هذا يسمح لي لكتابة وظائف ووظائف منفصلة كما (.ملف ج):

ON_BUTTON(blah) { ... }

والقوائم كما (.ملف ح):

ON_BUTTON(blah);
ON_DISPLAY(blah);
menu_frame menu_frame_blah = {
   menu_frame_blah_button,
   NULL,
   menu_frame_blah_display,
   NULL
};

هل هناك أي طريقة يمكنني من خلالها طي تعريف القائمة في تعريف واحد?يمكنني أن أفعل شيئا يتوسع MENU(blah, menu_frame_blah_button, NULL, menu_frame_blah_display, NULL) بالطبع ، ولكن هل هناك أي طريقة ل:

  • اجعلها أقصر (فارغة أو اسم ما)
  • إزالة الحاجة إلى ON_BUTTON(...); من قبل الهيكل

من الناحية المثالية ، أود MENU(blah, button, NULL, display, NULL) على حد سواء تحديد معالجات وبنية القائمة نفسها.لا أعرف على سبيل المثال كيفية منع توسيع المصطلح الأخير إلى ON_SWITCH(NULL).

أو ربما يجب أن أتعامل معها من طريقة أخرى?

هل كانت مفيدة؟

المحلول

لا يمكنك القيام بتوسيع الماكرو الشرطي في ج ، بحيث يتم توسيع الماكرو الخاص بك بشكل مختلف اعتمادا على الوسائط ، كما في:لا يمكنك استخدام # إذا كان ضمن تعريف الماكرو.

أعتقد أن أفضل ما يمكن أن تحصل عليه سيكون شيئا مثل MENU(blah, ITEM(blah,button), NULL, ITEM(blah,display), NULL), ، وما زلت بحاجة إلى مجموعة منفصلة للنماذج الأولية بسبب عدم وجود توسع مشروط.

شخصيا ، أود أن أكتب سيناريو بسيط لتوليد هذا النوع من رمز ج النمطي.واحد من شأنه أن يفهم بناء الجملة المطلوب.في بايثون أو أي شيء يناسبك…

نصائح أخرى

لقد كتبت البرامج النصية لبثون لتوليد هذا النوع من التعليمات البرمجية بالنسبة لي من قبل.قد ترغب في الذهاب إلى هذا الطريق وتواصل البرنامج النصي في عملية البناء الخاصة بك.

يمكنك برمجة الشروط والحلقات المحدودة والوسائط الافتراضية وكل هذه الأشياء في المعالج المسبق وحده.تحتوي مكتبة Boost على تطبيق لبعض ذلك في قسم المعالج المسبق الخاص بها.Boost مخصص بشكل أساسي لـ C++، ولكن يجب أن تعمل عناصر المعالج المسبق بشكل أساسي في C أيضًا.

من خلال هذه التقنيات يمكنك كتابة وحدات ماكرو معقدة ولكنها سهلة الاستخدام.يصبح التنفيذ أسهل قليلاً عند استخدام C99 بدلاً من C89 (لقد قمت بتسمية المُهيئات و VA_ARGS)، لكن مازال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top