"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > هل يمكن لـ C++ تحويل مؤشر الفراغ إلى مؤشر دالة؟

هل يمكن لـ C++ تحويل مؤشر الفراغ إلى مؤشر دالة؟

تم النشر بتاريخ 2024-11-12
تصفح:220

Can C   Convert a Void Pointer to a Function Pointer?

تحويل المؤشرات الفارغة إلى مؤشرات دالة: احتمال مشروط في لغة C

مشكلة

الحصول على مؤشر فارغ عبر dlsym () ، الهدف هو استدعاء الوظيفة المشار إليها بواسطة هذا المؤشر. لقد فشلت محاولة التحويل من خلال الإرسال باستخدام static_cast أو reinterpret_cast، على عكس التحويل بنمط C.

الإجابة

التحويل المباشر لمؤشر فارغ إلى مؤشر دالة غير مسموح به في C 98/03. ومع ذلك، يوفر C 0x دعمًا مشروطًا، مما يسمح للتنفيذ بإملاء السلوك.

نهج سلوك غير محدد:

على الرغم من أنه غير محدد بواسطة المعيار، إلا أن الكود التالي قد يعمل على معظم المنصات:

void *gptr = dlsym(some symbol..);
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast(reinterpret_cast(gptr));

بدلاً من ذلك:

fptr my_ptr = 0;
reinterpret_cast(my_ptr) = gptr;

طريقة معقدة ولكن محمولة:

تستغل هذه الطريقة حقيقة أن عنوان مؤشر الوظيفة هو مؤشر كائن:

// Get address as object pointer
void (**object_ptr)() = &my_ptr;

// Convert to void** (also an object pointer)
void **ppv = reinterpret_cast(object_ptr);

// Store address from 'gptr' in memory cell pointed to by 'ppv'
*ppv = gptr;

يظل هذا النهج غير محدد في المعيار ولكن يجب أن يعمل بشكل جيد في معظم التطبيقات.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3