تحذير عند النوع بين المؤشر والمؤشر إلى الوظيفة
سؤال
أقوم بنقل بعض التعليمات البرمجية C إلى بيئة رقاقة Ti DSP. أنا أتصارع مع برنامج التحويل البرمجي C.
لدي بنية بيانات تتضمن مؤشرًا إلى وظيفة. لدي وظيفة تهيئة بنية البيانات. شيء من هذا القبيل:
typedef void (*PFN_FOO)(int x, int y);
struct my_struct
{
PFN_FOO pfn;
};
init_struct(struct my_struct *p, void *pfn)
{
p->pfn = (PFN_FOO)pfn;
}
ضمن Visual Studio و GCC هذا النوع من التعليمات البرمجية دون شكوى. في الواقع ، لأن pfn
الحجة نوع void *
لا أحتاج حقًا حتى لوضع ممثلين هناك ؛ سوف يلقي ضمنيا دون شكوى.
في Code Composer Studio لبطاطا Ti DSP ، أحصل على "تحذير: تحويل نوع غير صالح"
تتمثل سياستي في جعل رمزتي تجمع دون تحذيرات ، لذلك أريد إصلاح هذا. لقد جربت كل أنواع الصب. اكتشفت أن المترجم سعيدًا تمامًا إذا ألقيت void *
مؤشر ل int
أولا ، ثم يلقيها على النوع الصحيح. EW ، يوك!
كيف يمكنني القيام بهذا المدلى بها دون أن يشكو المترجم؟ هل يجب أن ألقي حقًا int
لإغلاق المترجم؟
ملاحظة: أنا على وجه التحديد ليس تبحث عن حل لتأثير "التغيير init_struct()
لقبول أ PFN_FOO
بدل من void *
"هذا من شأنه أن ينجح في مقتطف الرمز المبسط هذا ، لكنه لن يعمل مع الكود الفعلي ، الذي يبني قائمة بالأشياء غير المتجانسة.
المحلول
لا يدعم المعيار C على وجه التحديد التحويلات بين المؤشرات إلى كائنات البيانات والمؤشرات إلى الوظائف. تدعم GCC و Visual Studio هذا كامتداد.
إذا كنت ترغب في جعل وظيفتك القياسية (ولكن لا تزال تستخدم void *
المعلمة) ، يمكنك تمرير مؤشر إلى مؤشر الوظيفة بدلاً من ذلك. هذا يعمل لأن مؤشرات الوظائف نفسها هي كائنات عادية ، لذلك يمكن تحويل مؤشر إلى مؤشر الوظيفة من وإلى void *
بخير:
init_struct(struct my_struct *p, void *pfn)
{
PFN_FOO *foo = pfn;
p->pfn = *foo;
}
يجب على المتصل إنشاء مؤقت PFN_FOO
اعتراض لتمرير مؤشر عندما يقوم بالمكالمة:
PFN_FOO fp = &somefunc;
/* ... */
init_struct(p, &fp);
نصائح أخرى