هل دول مجلس التعاون الخليجي أداء عبر ملف القضاء كود الميت?

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

  •  13-12-2019
  •  | 
  •  

سؤال

أقول لدي وظيفة

void do_something() {
    //....
    #ifdef FEATURE_X
        feature_x();
    #endif
    //....
}

يمكنني تجميع وتشغيل هذا دون أي مشاكل;إذا كنت أريد الميزة التي يمكنني تمريرها -D FEATURE_X وهو يعمل.

ومع ذلك ، ماذا لو كنت أود أن أضع do_something في ملف آخر (وليس من الضروري إعادة ترجمة هذا الملف أيضا في كل مرة أقرر فيها تغيير الخيار).إذا كان في نفس الملف ، أفترض ذلك

const int FEATURE_X=0;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}

سوف تستخدم القضاء كود الميت بشكل صحيح ، والقضاء على المكالمة.إذا وضعت هذا في ملف آخر ، دون عفرتو,

extern const int FEATURE_X;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}

فإنه لن إزالة التعليمات البرمجية (ليس لديها وسيلة لمعرفة).لذلك ، مع تمكين تحسين وقت الارتباط ، يمكن للمترجم اكتشاف قيمة FEATURE_X في وقت الارتباط, تحديد ما إذا كان يتم استخدام رمز أم لا, وإزالته إذا كان ذلك مناسبا?

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

المحلول

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

إذا كنت سوف تستخدم-د الطريق أو وضع الخاص بك const int FEATURE_X=0; في كل وحدة ثم نعم ، سيتم القضاء على التعليمات البرمجية.

نصائح أخرى

إذا بدلا من الرمز المشار إليه:

extern const int FEATURE_X;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}

ماذا لو تم ذلك باستخدام متغير وقت الارتباط مثل ذلك:

extern const int FEATURE_X;

void do_something() {
    //....
    if(NULL != &FEATURE_X) {
        feature_x();
    }
    //....
}

ثم في ملف تعليمات الرابط ، حدد

define exported symbol FEATURE_X = 0x0

سيكون هناك على أي حال لتحسين بها في وقت الارتباط?

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