سؤال

هل تتمتع وظيفة C المضمنة الثابتة بهوية في وقت التشغيل؟

هل يجب أن أهتم بتسمية تعارض تلك التركيبات؟

إذا تم تعريف الوظيفة في .c ملف؟هل هو نفسه؟

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

المحلول

هل تتمتع وظيفة C المضمنة الثابتة بهوية في وقت التشغيل؟

الدالة المضمنة الثابتة لها هوية داخل وحدة الترجمة إذا اختار المترجم مرة واحدة على الأقل عدم تضمينها، أو إذا أخذت عنوان الوظيفة.

العنوان المأخوذ صالح فقط في وحدة الترجمة الحالية (.c ملف).في وحدة تجميع أخرى (أخرى .c file)، سيعطيك المترجم عنوانًا مختلفًا.

كما هو الحال مع أي وظيفة أخرى ذات جسم مرئي للمترجم، قد يتم نسخ التعليمات البرمجية من الوظيفة بشكل كامل أو جزئي في أماكن مختلفة في رمز التجميع الذي تم إنشاؤه بواسطة المترجم.

الوظيفة المضمنة الثابتة (مثل أي وظيفة ثابتة) غير مرئية من أي وظيفة أخرى .c الملف من المترجمة حاليا .c ملف.

هل يجب أن أهتم بتسمية تعارض تلك التركيبات؟

فقط إذا أخذت عنوان دالة مضمنة ثابتة محددة في ملف رأس وقمت بما يلي:

  1. وظيفة مضمنة ثابتة f تم تعريفه في الملف a.h
  2. a.h يتم تضمينه بواسطة ملفات C x.c و y.c
  3. x.c يأخذ عنوان f ويخزنه في متغير عالمي f_addr
  4. y.c يأخذ عنوان f ويقارنها من حيث الهوية بالقيمة المخزنة فيها f_addr
  5. نتيجة المقارنة ستكون false, ، على الرغم من حقيقة أنه على مستوى مختلف من التجريد إنها نفس الوظيفة f

إذا تم تعريف الوظيفة في ملف .c؟هل هو نفسه؟

من وجهة نظر مترجم C، فهو تمامًا نفس تحديد الوظيفة في ملف الرأس وتضمين ملف الرأس في ملف .c.ليس لدى المترجم أي فكرة عن ملفات الرأس، فهو يرى فقط وحدة ترجمة مستمرة واحدة.ملف الرأس هو مفهوم موجود في أذهان المبرمجين الذين يستخدمون لغة C - وهذا المفهوم غير موجود من وجهة نظر مترجم C.

نصائح أخرى

إن تسمية دالة مضمنة لا تقل أهمية عن تسمية دالة غير مضمنة.الاسم يستخدم من قبل مترجم لتحديد الوظيفة التي سيتم الاتصال بها.يتم استخدامه أيضًا من قبل المبرمجين الذين يقرؤون الكود لفهم وظيفة الوظيفة.

في وقت التشغيل، اسم الوظيفة غير ذي صلة.

لاحظ أيضًا أن inline الكلمة الرئيسية هي فقط أ تَلمِيح إلى المترجم.قد لا تكون الوظيفة مضمنة بالفعل على الرغم من inline الكلمة الرئيسية.وبالمثل، فإن الوظيفة التي لم يتم وضع علامة عليها كـ inline ربما لا يزال مضمنًا بواسطة المترجم.

قد لا تهتم بتسمية تعارضات الوظائف المضمنة، لكنني أضمن أن المترجم سيفعل ذلك!

التضمين هو عملية في مرحلة لاحقة أثناء الترجمة - سيحتاج المترجم أولاً إلى تحديد بنية الاستدعاء لبرنامجك والتي تتطلب من المترجم حل جميع الاستدعاءات المسماة بشكل صحيح.

في وقت التشغيل، لا يمكنك معرفة اسم أي وظيفة يتم تنفيذها حاليًا دون ترميز بعض السحر لتحديدها - c ليس عاكس.

كما يشير مارك، الكلمة الأساسية المضمنة هي مجرد تلميح - للمترجم الحرية في تجاهلها إذا قرر الحصول على أداء أفضل من استدعاء صريح.

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