جعل شيء ما معرف C وسلسلة؟
-
02-07-2019 - |
سؤال
لنفترض أنك تريد إنشاء قائمة متطابقة من المعرفات والسلاسل
enum
{
NAME_ONE,
NAME_TWO,
NAME_THREE
};
myFunction(NAME_ONE, "NAME_ONE");
myFunction(NAME_TWO, "NAME_TWO");
myFunction(NAME_THREE, "NAME_THREE");
..دون تكرار نفسك، ودون إنشاء التعليمات البرمجية تلقائيًا، باستخدام وحدات ماكرو C/C++
تخمين الأولي:
يمكنك إضافة ملف #include يحتوي على
myDefine(NAME_ONE)
myDefine(NAME_TWO)
myDefine(NAME_THREE)
ثم استخدمه مرتين مثل:
#define myDefine(a) a,
enum {
#include "definitions"
}
#undef myDefine
#define myDefine(a) myFunc(a, "a");
#include "definitions"
#undef myDefine
لكن #define لا يسمح لك بوضع المعلمات داخل سلسلة؟
المحلول
بالنسبة إلى #define الثاني، تحتاج إلى استخدام عامل تشغيل المعالج المسبق #، كما يلي:
#define myDefine(a) myFunc(a, #a);
هذا يحول الوسيطة إلى سلسلة.
نصائح أخرى
إليك طريقة جيدة لإعلان قائمة الأسماء:
#define FOR_ALL_FUNCTIONS(F)\
F(NameOne)\
F(NameTwo)\
F(NameThree)\
#define DECLARE_FUNCTION(N)\
void N();
#define IMPLEMENT_FUNCTION(N)\
void N(){}
FOR_ALL_FUNCTIONS(DECLARE_FUNCTION);
FOR_ALL_FUNCTIONS(IMPLEMENT_FUNCTION);
بهذه الطريقة يمكن إعادة استخدام قائمة الأسماء هذه عدة مرات.لقد استخدمته لإنشاء نماذج أولية لميزات اللغة الجديدة، على الرغم من أنني لم أنتهي من استخدامها مطلقًا.لذا، إذا لم يكن هناك شيء آخر، فقد كانت طريقة رائعة للعثور على طرق مسدودة في اختراعاتك.أتساءل عما إذا كان ذلك بسبب ما يقولون:"وحدات الماكرو سيئة"...:)