سؤال

غالبًا ما أجد أن قسم الرؤوس في الملف يصبح أكبر وأكبر طوال الوقت ولكنه لا يصبح أصغر أبدًا.ربما تكون فئات الملف المصدر قد تم نقلها وإعادة هيكلتها على مدار عمر الملف المصدر، ومن المحتمل جدًا أن يكون هناك عدد لا بأس به منها #includes التي لا تحتاج إلى أن تكون هناك وبعد الآن.تركهم هناك يؤدي فقط إلى إطالة وقت الترجمة وإضافة تبعيات الترجمة غير الضرورية.قد تكون محاولة معرفة ما لا تزال هناك حاجة إليه أمرًا شاقًا للغاية.

هل هناك نوع من الأدوات التي يمكنها اكتشاف التوجيهات غير الضرورية #include واقتراح التوجيهات التي يمكنني إزالتها بأمان؟
هل الوبر يفعل هذا ربما؟

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

المحلول

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

نصائح أخرى

وcppclean جوجل (وصلات ل: تحميل و <لأ href = "https://code.google كوم / ع / cppclean / "يختلط =" noreferrer "> وثائق ) يمكن العثور على عدة فئات من المشاكل C ++، وأنه يمكن الآن العثور على #includes لزوم لها.

تشمل-what-

وهناك أيضا أداة تستند رنة، أولا استخدام ، التي يمكن أن تفعل هذا. تشمل ما قمت الاستخدام يمكن أن تشير حتى إلى الأمام الإعلانات (لذلك لم يكن لديك ل# تضمين كثيرا) واختياريا تنظيف #includes لك.

الكسوف CDT أيضا أن هذه الوظيفة التي بنيت في: الذهاب ضمن القائمة المصدر والنقر تنظيم يشمل سوف أبجد # تشمل: وإضافة أي الرؤوس التي الكسوف يعتقد كنت تستخدم دون بما في ذلك مباشرة لهم، والتعليقات من أي رؤوس أنه لا تعتقد أنك بحاجة. هذه الميزة ليست 100٪ موثوق بها، ولكن.

وكما تحقق <لأ href = "https://github.com/include-what-you-use/include-what-you-use" يختلط = "noreferrer" عنوان = "تشمل ما قمت الاستخدام "> تشمل ما قمت الاستخدام ، الذي يحل مشكلة مماثلة.

المشكلة في اكتشاف التضمينات غير الضرورية هي أنه لا يمكن أن يكون مجرد مدقق تبعية النوع.التضمين الزائد هو ملف لا يقدم أي شيء ذو قيمة للتجميع و لا يغير عنصرًا آخر تعتمد عليه الملفات الأخرى.هناك العديد من الطرق التي يمكن لملف الرأس من خلالها تغيير الترجمة، على سبيل المثال عن طريق تحديد ثابت، وإعادة تعريف و/أو حذف ماكرو مستخدم، وإضافة مساحة اسم تغير البحث عن الاسم بطريقة ما أسفل السطر.من أجل اكتشاف عناصر مثل مساحة الاسم، فإنك تحتاج إلى أكثر من مجرد معالج مسبق، فأنت في الواقع تحتاج تقريبًا إلى مترجم كامل.

يعد Lint بمثابة مدقق للأسلوب وبالتأكيد لن يتمتع بهذه الإمكانية الكاملة.

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

وأعتقد أن PCLint أن تفعل ذلك، ولكنها كانت منذ سنوات قليلة لقد نظرت إلى ذلك. قد تحقق من ذلك.

ونظرت هذا بلوق ومؤلف تحدث قليلا حول تكوين PCLint لإيجاد يشمل غير المستخدمة. قد يكون من المفيد إلقاء نظرة.

CScout متصفح إعادة بيع ديون يمكن الكشف عن زائدة تشمل التوجيهات في C (للأسف لا C ++) رمز. يمكنك أن تجد وصفا لكيفية عمله في هذه المادة مجلة .

يمكنك كتابة برنامج نصي سريع يمحو توجيه #include واحدًا، ويجمع المشاريع، ويسجل الاسم في #include والملف الذي تمت إزالته منه في حالة عدم حدوث أخطاء في التجميع.

اتركه يعمل أثناء الليل، وفي اليوم التالي سيكون لديك قائمة صحيحة بنسبة 100% بالملفات المضمنة التي يمكنك إزالتها.

في بعض الأحيان تعمل القوة الغاشمة فقط :-)


يحرر: وأحيانا لا :-).إليك بعض المعلومات من التعليقات:

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

نأسف لإعادة النشر هنا، فغالبًا ما لا يقوم الأشخاص بتوسيع التعليقات.

تحقق من تعليقي على Crashmstr، سوف يقوم FlexeLint / PC-Lint بذلك نيابةً عنك.رسالة إعلامية 766.يناقش القسم 11.8.1 من دليلي (الإصدار 8.0) هذا الأمر.

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

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

إذا كنت تستخدم الكسوف CDT يمكنك محاولة http://includator.com وهو مجاني لاختبار بيتا (في وقت كتابة هذه السطور) وتلقائيا يزيل #includes زائدة أو يضيف منها في عداد المفقودين. بالنسبة لأولئك المستخدمين الذين لديهم FlexeLint أو PC-لينت وتستخدم Elicpse CDT، قد يكون http://linticator.com خيار (أيضا مجانا لاختبار بيتا). في حين أنه يستخدم التحليل لينت، فإنه يوفر حلول سريعة لإزالة عبارات تضمين # زائدة تلقائيا.

لقد حاولت استخدام Flexelint (إصدار Unix من PC-Lint) وحصلت على نتائج مختلطة إلى حد ما.من المحتمل أن يكون هذا لأنني أعمل على قاعدة تعليمات برمجية كبيرة جدًا ومعقدة.أوصي بفحص كل ملف تم الإبلاغ عنه على أنه غير مستخدم بعناية.

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

إحدى الطرق التي يمكن للأدوات الآلية أن تخطئ بها:

في أ.هب:

class A { 
  // ...
};

في بي.هب:

#include "A.hpp

class B {
    public:
        A foo;
};

في C.cpp:

#include "C.hpp"  

#include "B.hpp"  // <-- Unneeded, but lint reports it as needed
#include "A.hpp"  // <-- Needed, but lint reports it as unneeded

إذا اتبعت الرسائل الواردة من Flexelint بشكل أعمى، فسوف تفسد تبعيات #include الخاصة بك.هناك المزيد من الحالات المرضية، ولكن في الأساس ستحتاج إلى فحص الرؤوس بنفسك للحصول على أفضل النتائج.

أوصي بشدة بهذا المقال على الهيكل المادي وC++ من مدونة الألعاب من الداخل.يوصون باتباع نهج شامل لتنظيف الفوضى #include:

القواعد الارشادية

إليك مجموعة من الإرشادات المقطرة من كتاب لاكوس والتي تقلل من عدد التبعيات المادية بين الملفات.لقد كنت أستخدمها منذ سنوات وكنت دائمًا سعيدًا جدًا بالنتائج.

  1. يتضمن كل ملف CPP ملف الرأس الخاص به أولاً.[قص]
  2. يجب أن يتضمن ملف الرأس جميع ملفات الرأس اللازمة لتحليله.[قص]
  3. يجب أن يحتوي ملف الرأس على الحد الأدنى لعدد ملفات الرأس اللازمة لتحليله.[قص]

هذه المقالة يفسر تقنية # تشمل إزالة باستخدام إعراب Doxygen. هذا مجرد سيناريو بيرل، لذلك فإنه من السهل جدا للاستخدام.

وهناك أداة مجانية تشمل تبعيات الملف مراقب التي يمكن دمجها في استوديو مرئي. فإنه يدل على لزوم لها #includes باللون الأحمر.

وربما في وقت متأخر قليلا، ولكنني وجدت مرة واحدة في السيناريو بكت بيرل أن فعلت ما أردت. انها سوف تحتاج الى بعض التكيف أعتقد (وأنا لست ضليعا في بيرل)، ولكن ينبغي أن تفعل خدعة:

HTTP : //trac.webkit.org/browser/branches/old/safari-3-2-branch/WebKitTools/Scripts/find-extra-includes

و(هذا هو الفرع القديم لجذع لم يقم الملف بعد الآن)

هناك نوعان من الملفات غير الضرورية #include:

  1. ملف رأس في الواقع غير مطلوب من قبل الوحدة (.C ، .CPP) على الإطلاق
  2. هناك حاجة إلى ملف الرأس بواسطة الوحدة ولكن يتم تضمينه أكثر من مرة أو مباشرة أو غير مباشر.

هناك طريقتان في تجربتي تعملان بشكل جيد لاكتشافه:

  • gcc -H أو cl.exe /showincludes (حل المشكلة 2)

    في العالم الحقيقي ، يمكنك تصدير cflags = -H قبل أن تجعل ، إذا لم يتم تجاوز جميع خيارات Makefile.أو كما استخدمت ، يمكنك إنشاء غلاف CC/G ++ لإضافة خيارات -H بالقوة إلى كل استدعاء من $ (CC) و $ (CXX).وقم بتعبئة دليل Wrapper إلى متغير مسار $ ، ثم يستخدم كل شيء على أمر Wrapper بدلاً من ذلك.بالطبع يجب أن تستدعي الغلاف الخاص بك برنامج التحويل البرمجي الحقيقي.تحتاج هذه الحيل إلى التغيير إذا كان Makefile يستخدم GCC مباشرة.بدلاً من $ (CC) أو $ (CXX) أو عن طريق القواعد الضمنية.

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

    جعل نظيفة

    جعل 2> & 1 | tee result.txt

  • PC-Lint/FlexElint (حل مشكلة على حد سواء 1 و 2)

    تأكد من إضافة خيارات +e766، هذا التحذير يتعلق بـ:ملفات الرأس غير المستخدمة.

    بكلينت/فلينت -vf ...

    سيؤدي هذا إلى تضمين ملفات رأس لمخرجات pclint، وسيتم وضع مسافة بادئة لملفات الرأس المتداخلة بشكل مناسب.

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

وهنا هو تحديد رأس زائدة عن الحاجة . انها ليست مثالية ولكن يلغي يتضمن "واضحة" لا لزوم لها. التخلص من هذه يقطع شوطا طويلا في تنظيف التعليمات البرمجية.

يمكن الوصول إليها مباشرة على جيثب.

وGimpel برمجيات PC ينت يمكن أن يقدم تقريرا عن عندما ملف التضمين قد أدرج أكثر من مرة في وحدة تجميع <الإضراب>، لكنها لم تتمكن من العثور تضمين الملفات التي لا حاجة في الطريقة التي تبحث عنها.

تعديل: ما في وسعها. انظر itsmatt في الإجابة

CLion ، وC / C ++ IDE من JetBrains، بالكشف عن زائدة عن الحاجة يتضمن خارج ل -صندوق. ورمادي التدريجي هذه في محرر، ولكن هناك أيضا وظائف ل الأمثل يتضمن في الملف الحالي أو المشروع بأكمله .

ولقد وجدت أن تدفعه مقابل هذه الوظيفة على الرغم؛ CLion يستغرق بعض الوقت لفحص وتحليل المشروع الخاص بك عند تحميلها أولا.

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