كيف يتم استدعاء المؤشر إلى وظيفة دون ديورينج؟

StackOverflow https://stackoverflow.com/questions/944479

  •  09-09-2019
  •  | 
  •  

سؤال

لدي بيان Typedef غريب في برنامج C ++، الذي تم إنشاؤه بواسطة Py ++.

double radius(int);  // function to be wrapped
typedef double (*radius_function_type)(int);    
bp::def("radius", radius_function_type(&radius));   // bp::def is a function for wrapping

ما أحسبه حتى الآن هو أن كتاب Typedef أعلاه ليس من النوع، ومعظمنا على دراية،

typedef complex_type simple_alias;

بدلا من ذلك هو وسيلة لإعلان المؤشر إلى وظيفة تأخذ int كوسيطة وإرجاع مضاعفة (نفس النموذج الأولي). لذلك سؤالي الآن، كيف تأتي المؤشر إلى وظيفة (بدون dereferencing) يكون مسمى مع عنوان وظيفة كوسيطة؟ هذا أيضا لا يتطابق مع النموذج الأولي. أحد يشرح لو سمحتوا!

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

المحلول

سؤالك مربك. هل تسأل ماذا يفعل هذا:

radius_function_type(&radius)"

هذا هو مجرد Typecast C ++، مثل قليلا:

radius (int (42));

ولكن نظرا لأن RADIUS بالفعل من النوع RADIUS_FACK_TYPE، فيمكنك فقط القيام به:

bp::def("radius", radius);

ولكن نظرا لأن هذا هو رمز الناتج عن PY ++، فمن المحتمل أن تكون حذرا للغاية مع الإخراج.

نصائح أخرى

لا يعلن متغير مؤشر الوظائف ولكن استدعاء مؤشر الوظيفة Typedef radius_function_type. radius_function_type(&radius) هو مجرد (زائدة عن الحاجة) يلقي مؤشر الوظيفة نفسه. (unary. & عنوان المشغل هو أيضا زائدة عن الحاجة؛ للحصول على وظيفة، radius و &radius هي نفس الشيء.)

على مستوى منخفض، تتمثل الدعوة وظيفة فقط في وضع الوسائط في مكان ما وفقا لاتفاقية الاتصال الأساسية (عادة على المكدس) ثم القفز إلى عنوان ذاكرة. لذلك يمكن للمترجم استدعاء وظيفة مع مجرد مؤشر إذا كان يعرف نوع مؤشر الوظيفة (توقيع الدالة) وقيمة المؤشر نفسها.

حسنا ... إنه مشابه بعض الشيء كيف ترتبط صفيفات المؤشرات، في C و C ++. اسم الوظيفة هو أساسا مؤشر أيضا. ينظر إليها من هذا المنظور، ليس من المستغرب جدا بالنظر إلى التعريف:

int foo(int a, int b)
{
  return a + b;
}

يمكنك القيام بالمكالمات إما مباشرة، من خلال المؤشر اسم الوظيفة:

foo(1, 2);

أو عن طريق تخزين هذه القيمة في متغير منفصل، يجب الإعلان عنها كمؤشر:

int (*pointer)(int, int) = foo;
pointer(1, 2);

في هذه الحالة، يمكننا الاتصال بمتغير المؤشر مباشرة، وليس هناك حاجة أيضا إلى "اتخاذ عنوان" الوظيفة بشكل صريح بشكل صريح &foo.

dereferencing (بالطريقة التي تعتقد أنها) تعني مؤشر الوظيفة: الوصول إلى ذاكرة رمز لأنه سيكون ذاكرة بيانات.

مؤشر الوظيفة لا يفترض أن يتم تغييرها بهذه الطريقة. بدلا من ذلك، يسمى.

أود استخدام اسم "Dereference" جنبا إلى جنب مع "مكالمة". موافق.

على أي حال: تم تصميم C بهذه الطريقة التي تعنيها معرف اسم الوظيفة وكذلك مؤشر وظيفة Holded Holding نفس الشيء: العنوان إلى رمز التعليمات البرمجية. ويسمح بالقفز إلى هذه الذاكرة باستخدام بناء جملة المكالمات () إما على معرف أو متغير.

مؤشر الوظيفة هو أساسا عنوان الوظيفة التي يجب الاحتجاج بها. لاستدعاء الوظيفة المدببة بمؤشر دالة، تفكر في مؤشر الوظيفة كما لو كان اسم الوظيفة التي ترغب في الاتصال بها. فعل الدعوة في نفسه يؤدي الديريل؛ ليست هناك حاجة لديريليل واضح.

يمكن أن تبدو بناء جملة مؤشر الدالة مثل المؤشرات (مع & *) أو يمكن حذفها أيضا. كما @فك أشار بالفعل إلى ما يشبه كيفية معالجة صفيفات حيث تشبه الصفيف العاري المؤشر واختياريا يمكنك بادئة الصفيف مع وإحراز العنوان.

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