سؤال

لقد بحثت ولكن لم أتمكن من العثور على أي نتائج (قد تكون المصطلحات الخاصة بي متوقفًا) لذا سامحني إذا تم طلب ذلك من قبل.

كنت أتساءل عما إذا كانت هناك طريقة سهلة للاتصال void* كدالة في C دون الإعلان أولاً عن مؤشر الوظيفة ثم تعيين مؤشر الوظيفة على العنوان ؛

بمعنى آخر. على افتراض أن الوظيفة المراد استدعاؤها هي النوع void(void)

void *ptr;
ptr = <some address>;
((void*())ptr)(); /* call ptr as function here */

مع الكود أعلاه ، أحصل خطأ C2066: يلقي إلى نوع الوظيفة غير قانوني في VC2008

إذا كان ذلك ممكنًا ، كيف سيختلف بناء الجملة للوظائف مع أنواع الإرجاع والمعلمات المتعددة؟

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

المحلول

يجب أن يكون فريقك:

((void (*)(void)) ptr)();

بشكل عام ، يمكن أن يكون هذا أكثر بساطة عن طريق إنشاء ملف typedef لنوع مؤشر الوظيفة:

typedef void (*func_type)(void);
((func_type) ptr)();

ومع ذلك ، يجب أن أشير إلى أن إلقاء مؤشر عادي (مؤشر إلى الكائن) من أو من مؤشر الوظيفة ليس قانونيًا تمامًا في المعيار C (على الرغم من أنه امتداد شائع).

نصائح أخرى

أشعر بالارتباك بفظاعة عند الصب إلى أنواع الوظائف. من الأسهل والأكثر قابلية للقراءة نوع مؤشر الوظيفة:

void *ptr = ...;
typedef void (*void_f)(void);
((void_f)ptr)();

في C ++: reinterpret_cast< void(*)() > (ptr) ()

استخدام reinterpret_cast يوفر لك مجموعة من الأقواس المربكة ، و < > بوضوح يميز النوع بصرف النظر عن المكالمة نفسها.

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