سؤال

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

كيف يقوم أحدهم بتعديل مكتبة لجعله رأسه فقط؟

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

المحلول

يمكنك استعمال ال inline الكلمة الرئيسية:

// header.hpp (included into multiple translation units)

void foo_bad() {} // multiple definitions, one in every translation unit :(

inline void foo_good() {} // ok :)

inline يسمح الرابط ببساطة باختيار تعريف واحد وتجاهل الباقي.

(على هذا النحو، إذا كانت هذه التعريفات لا تتطابق في الواقع، فستحصل على جرعة جيدة من السلوك غير المحدد ...)


كعضوات جانبا، يتم تحديد الوظائف العضوية داخل نوع الفصل، بشكل ضمني inline:

struct myclass
{
    void i_am_inline_implicitly()
    {
        // because my definition is here
    }

    void but_i_am_not();
    void neither_am_i();
};

inline void myclass::but_i_am_not()
{
    // but that doesn't mean my definition cannot be explicitly inline
}

void myclass::neither_am_i()
{
    // but in this case, no inline for me :(
}

نصائح أخرى

استخدام حراس الرأس كما يوحي ليز ولا تنس أن تضع "مضمنة" قبل أساليب وظيفتك.

بمعنى آخر

#ifndef MY_HEADER_H_
#define MY_HEADER_H_

inline RetType FunctionName( ParamType1 param1, ParamType2 param2 )
{
    // Function body
    return retType;
}

#endif

وأعتقد أيضا أنك ستحتاج إلى تجنب أي استخدام للمتغيرات العالمية أو المتغيرات الثابتة في رمز المكتبة الأول فقط.

استخدم حراس الرأس للأجزاء التي تجميعها في مكان واحد.

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