هل يمكن للدالة المضمنة المحددة في ملفين منفصلين CPP إنشاء رموز مكررة أثناء الارتباط؟

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

سؤال

أجد العديد من الموارد عبر الإنترنت تتنقل حول كيفية inline (وحتى __attribute__((always_inline)) أو __forceinline) لا يجبر المترجم (مثل GCC أو VisualC ++) على تحديد الوظيفة. ولكن متى لن يتم تطبيقه بالضبط؟ هل يوجد مثال لعبة؟

ربما ليس بالضرورة نفس السؤال ، متى ستقوم الوظيفة الموسومة بها inline مدرج في ملفين مختلفين CPP يخلقان مشاكل أثناء الارتباط؟ وهي توليد رموز مكررة؟

فيما يلي صندوق رمل ملموس لمحاولة كسر المترجم الذي يدخل وإنشاء رمز مكرر:

في myinline.h:

inline int myinline()
{
  // code that cannot be inlined...
  ...
}

في aux.cpp:

#include "myinline.h"
int aux()
{
  return my_inline();
}

في main.cpp:

#include "myinline.h"
int aux();
int main()
{
  return aux() + my_inline();
}

بعد ذلك ، على سبيل المثال ، هناك بعض الكود (الحد الأدنى) myinline سيؤدي ذلك إلى رمز مكرر عند التجميع والربط بـ:

g++ -o aux.o -c aux.cpp
g++ -o main.o -c main.cpp
g++ -o example aux.o main.o

?

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

المحلول

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

(يحدث هذا طوال الوقت لوظائف أعضاء الفصل المعرفة في الرؤوس.)

إذا كنت تريد فقط رمز الجيل على الحدث ، يمكنك تخزين عنوان الوظيفة في مكان ما:

auto fp = my_inline;

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

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