سؤال

لنفترض أنك تريد إنشاء قائمة متطابقة من المعرفات والسلاسل

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);

بهذه الطريقة يمكن إعادة استخدام قائمة الأسماء هذه عدة مرات.لقد استخدمته لإنشاء نماذج أولية لميزات اللغة الجديدة، على الرغم من أنني لم أنتهي من استخدامها مطلقًا.لذا، إذا لم يكن هناك شيء آخر، فقد كانت طريقة رائعة للعثور على طرق مسدودة في اختراعاتك.أتساءل عما إذا كان ذلك بسبب ما يقولون:"وحدات الماكرو سيئة"...:)

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