تخصيص المعلمات باستخدام وحدات الماكرو C
تعد وحدات الماكرو جانبًا أساسيًا في برمجة C، مما يسمح بتخصيص التعليمات البرمجية والمرونة. أحد المتطلبات الشائعة هو القدرة على تحديد المعلمات الاختيارية داخل وحدات الماكرو.
المعلمات الاختيارية
خذ بعين الاعتبار المثال التالي حيث لدينا ماكرو يطبع سلسلة:
#define PRINT_STRING(message) PrintString(message, 0, 0)
يقبل هذا الماكرو معلمة إلزامية واحدة، الرسالة للطباعة. ولجعلها أكثر تنوعًا، يمكننا تقديم معلمات اختيارية لحجم السلسلة ونمط الخط:
#define PRINT_STRING_1_ARGS(message) PrintString(message, 0, 0) #define PRINT_STRING_2_ARGS(message, size) PrintString(message, size, 0) #define PRINT_STRING_3_ARGS(message, size, style) PrintString(message, size, style)
التحميل الزائد بوحدات الماكرو
لتحقيق التحميل الزائد، نستخدم خدعة لحساب عدد الوسائط المتوفرة للماكرو. بعد ذلك، نختار الماكرو المساعد المناسب بناءً على عدد الوسائط هذا:
#define GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4 #define PRINT_STRING_MACRO_CHOOSER(...) \ GET_4TH_ARG(__VA_ARGS__, PRINT_STRING_3_ARGS, \ PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS, )
استخدام
يمكننا الآن استخدام الماكرو PRINT_STRING المحمل بشكل زائد مع المعلمات الاختيارية:#define PRINT_STRING(...) PRINT_STRING_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)#define PRINT_STRING(...) PRINT_STRING_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)على سبيل المثال، يمكننا استدعاء الماكرو بدون وسائط لطباعة السلسلة الافتراضية:PRINT_STRING("Hello, World!");
#define PRINT_STRING(...) PRINT_STRING_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)أو حدد حجم السلسلة:PRINT_STRING("مرحبًا، World!", 18);
#define PRINT_STRING(...) PRINT_STRING_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)أو حجم السلسلة ونمط الخط:PRINT_STRING("Hello, World!", 18, غامق);
#define PRINT_STRING(...) PRINT_STRING_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)هذا النهج يبسط التعامل مع المعلمات لمتصل الماكرو، مما يعزز إمكانية إعادة استخدام التعليمات البرمجية وتعدد الاستخدامات.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3