IT-Swarm.Net

C/C++ में सुपरफ़्लूड #includes का पता लगाना?

मुझे अक्सर लगता है कि किसी फाइल का हेडर सेक्शन हर समय बड़ा और बड़ा होता जाता है लेकिन यह कभी छोटा नहीं होता। एक स्रोत फ़ाइल कक्षाओं के जीवन भर में स्थानांतरित कर दिया गया हो सकता है और यह बहुत संभव है कि वहाँ बहुत कुछ #includes हैं कि वहाँ और अब होने की जरूरत नहीं है। उन्हें छोड़कर केवल संकलन का समय लम्बा होता है और अनावश्यक संकलन निर्भरता बढ़ जाती है। यह पता लगाने की कोशिश की जा रही है कि अभी भी कितनी थकावट हो सकती है।.

क्या किसी प्रकार का उपकरण है जो अति-विशिष्ट # निर्देशों का पता लगा सकता है और सुझाव दे सकता है कि मैं किन लोगों को सुरक्षित रूप से हटा सकता हूं?
क्या लिंट ऐसा कर सकता है?

259
shoosh

यह स्वचालित नहीं है, लेकिन doxygen#included फ़ाइलों के लिए निर्भरता आरेख का उत्पादन करेगा। आपको नेत्रहीन उनके माध्यम से जाना होगा, लेकिन वे क्या उपयोग कर रहे हैं की एक तस्वीर प्राप्त करने के लिए बहुत उपयोगी हो सकते हैं।.

40
anon

Google की cppclean (लिंक: डाउनलोड , प्रलेखन ) C++ समस्याओं की कई श्रेणियां पा सकते हैं, और यह अब शानदार #includes पा सकते हैं।.

एक क्लैंग-आधारित टूल भी है, शामिल-क्या-आप-उपयोग , जो ऐसा कर सकते हैं। शामिल-क्या-आप-उपयोग भी आगे की घोषणाओं का सुझाव दे सकते हैं (ताकि आपको # बहुत अधिक नहीं करना है) और वैकल्पिक रूप से आपके लिए अपने #includes को साफ करें।.

ग्रहण सीडीटी के वर्तमान संस्करणों में भी इस कार्यक्षमता का निर्माण किया गया है: स्रोत मेनू के तहत जा रहे हैं और इसमें ऑर्गनाइज शामिल करने पर क्लिक करना आपके # वर्णमाला को सम्मिलित करेगा, किसी भी हेडर को जोड़ें जो सोचता है कि आप उनके बिना सीधे उपयोग कर रहे हैं, और कोई टिप्पणी नहीं हेडर है कि यह नहीं लगता है कि आप की जरूरत है। हालाँकि यह सुविधा 100% विश्वसनीय नहीं है।.

157
Josh Kelley

यह भी देखें शामिल करें-क्या-आप उपयोग करें , जो एक समान समस्या हल करता है।.

58
Tzafrir

सतही का पता लगाने के साथ समस्या यह है कि यह सिर्फ एक प्रकार की निर्भरता परीक्षक नहीं हो सकता है। एक अतिश्योक्तिपूर्ण में शामिल एक फाइल है जो संकलन औरके लिए मूल्य का कुछ भी नहीं प्रदान करता है _ _ किसी अन्य आइटम को परिवर्तित नहीं करता है जो अन्य फाइलें निर्भर करती हैं। कई तरीके हैं एक हेडर फ़ाइल एक संकलन को बदल सकती है, एक स्थिरांक को परिभाषित करके और उपयोग किए गए मैक्रो को फिर से परिभाषित करके, एक नामस्थान को जोड़कर, जो किसी नाम की खोज को लाइन के नीचे किसी तरह से बदल देता है। नामस्थान जैसी वस्तुओं का पता लगाने के लिए आपको एक प्रीप्रोसेसर की तुलना में बहुत अधिक की आवश्यकता होती है, आपको वास्तव में लगभग पूर्ण कंपाइलर की आवश्यकता होती है।.

लिंट एक शैली चेकर की अधिक है और निश्चित रूप से यह पूरी क्षमता नहीं होगी।.

मुझे लगता है कि आपको एक शानदार तरीके से पता लगाने का एकमात्र तरीका मिल जाएगा, जिसमें सुइट्स को निकालना, संकलित करना और चलाना शामिल है।.

24
JaredPar

मैंने सोचा था कि PCLint यह करेगा, लेकिन जब से मैंने इसे देखा है तब से कुछ साल हो गए हैं। आप इसे देख सकते हैं।.

मैंने इस ब्लॉग को देखा और लेखक ने अप्रयुक्त को खोजने के लिए PCLint को कॉन्फ़िगर करने के बारे में थोड़ी बात की। देखने लायक हो सकता है।.

15
itsmatt

CScout रीफ़्रैक्टरिंग ब्राउज़र सुपरफ़्लड का पता लगा सकता है सी में निर्देश शामिल हैं (दुर्भाग्य से सी ++ नहीं)। आप यह वर्णन कर सकते हैं कि यह कैसे काम करता है यह पत्रिका लेख।.

7
Diomidis Spinellis

आप एक त्वरित स्क्रिप्ट लिख सकते हैं जो एकल #include निर्देश को मिटाता है, परियोजनाओं को संकलित करता है, और #include में नाम को लॉग करता है और फ़ाइल को उस मामले से हटा दिया गया था जिसमें कोई संकलन त्रुटियां नहीं हुई थीं।.

इसे रात के दौरान चलने दें, और अगले दिन आपके पास शामिल फ़ाइलों की एक 100% सही सूची होगी जिसे आप निकाल सकते हैं।.

कभी कभी जानवर बल बस काम करता है :-)


संपादित करें: और कभी-कभी यह :-) नहीं होता है। यहाँ टिप्पणियों से थोड़ी जानकारी है:

  1. कभी-कभी आप दो हेडर फ़ाइलों को अलग-अलग निकाल सकते हैं, लेकिन दोनों एक साथ नहीं। एक हल रन के दौरान हेडर फ़ाइलों को हटाने और उन्हें वापस लाने के लिए नहीं है। यह उन फ़ाइलों की एक सूची प्राप्त करेगा जिन्हें आप सुरक्षित रूप से निकाल सकते हैं, हालाँकि हटाने के लिए अधिक फ़ाइलों के साथ एक समाधान हो सकता है, जो इस एल्गोरिथ्म को नहीं मिलेगा। (यह हटाने के लिए फ़ाइलों को शामिल करने के स्थान पर एक लालची खोज है। यह केवल एक स्थानीय अधिकतम मिलेगा)
  2. व्यवहार में सूक्ष्म परिवर्तन हो सकते हैं यदि आपके पास कुछ #ifdefs के आधार पर कुछ मैक्रोज़ को अलग तरीके से परिभाषित किया गया हो। मुझे लगता है कि ये बहुत दुर्लभ मामले हैं, और यूनिट टेस्ट जो बिल्ड का हिस्सा हैं, इन परिवर्तनों को पकड़ना चाहिए।.
6
Gilad Naor

मुझे कभी भी एक पूर्ण उपकरण नहीं मिला है जो यह कहता है कि आप क्या पूछ रहे हैं। मेरे द्वारा उपयोग की जाने वाली निकटतम चीज़ है - इन्मेमेन्जर , जो आपके हेडर इंक्लूसिव ट्री को रेखांकन करता है, ताकि आप केवल एक फ़ाइल में शामिल हेडर जैसी चीजों को नेत्रहीन रूप से स्पॉट कर सकें और सर्कुलर हेडर इंक्लूज़न कर सकें।.

5
Dan Olson

यहाँ (पोस्ट) के लिए क्षमा करें, लोग अक्सर टिप्पणियों का विस्तार नहीं करते हैं।.

क्रैशमैस्ट्र के लिए मेरी टिप्पणी देखें, FlexeLint/PC-Lint आपके लिए ऐसा करेगा। सूचनात्मक संदेश 766. मेरे मैनुअल का संस्करण 11.8.1 (संस्करण 8.0) इस पर चर्चा करता है।.

इसके अलावा, और यह महत्वपूर्ण है, जब तक संदेश चला नहीं जाता है तब तक इसे जारी रखें । दूसरे शब्दों में, अप्रयुक्त हेडर को हटाने के बाद, एक बार फिर से चलाने के लिए, कुछ हेडर को हटाने के बाद अधिक हेडर फाइलें "अनावश्यक" हो सकती हैं। (यह मूर्खतापूर्ण लग सकता है, इसे धीरे से पढ़ें और इसे पार्स करें, यह समझ में आता है।)

5
Dan

यदि आप ग्रहण सीडीटी का उपयोग कर रहे हैं, तो आप कोशिश कर सकते हैं http://includator.com जो बीटा परीक्षकों (इस लेखन के समय) के लिए स्वतंत्र है और स्वचालित रूप से अतिरेक #includes को हटा देता है या लापता लोगों को जोड़ता है। उन उपयोगकर्ताओं के लिए जिनके पास FlexeLint या PC-Lint है और वे Elicpse CDT, http://linticator.com का उपयोग कर रहे हैं एक विकल्प हो सकता है (बीटा परीक्षण के लिए भी मुफ्त)। जबकि यह लिंट के विश्लेषण का उपयोग करता है, यह स्वचालित रूप से शानदार #include स्टेटमेंट को हटाने के लिए त्वरित-सुधार प्रदान करता है।.

4
PeterSom

एक नि: शुल्क उपकरण है फाइल डिपेंडेंसी वॉचर शामिल करें जिसे विज़ुअल स्टूडियो में एकीकृत किया जा सकता है। यह लाल रंग में शानदार #includes दिखाता है।.

2
Vladimir

यह लेख Doxygen के पार्सिंग का उपयोग करके हटाने की # तकनीक की व्याख्या करता है। यह सिर्फ एक पर्ल स्क्रिप्ट है, इसलिए इसका उपयोग करना काफी आसान है।.

2
Steve Gury

मैंने 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 के संदेशों का आँख बंद करके अनुसरण करते हैं तो आप अपनी # निर्भरता को कम कर देंगे। अधिक रोग संबंधी मामले हैं, लेकिन मूल रूप से आपको सबसे अच्छे परिणामों के लिए हेडर का निरीक्षण करने की आवश्यकता है।.

मैं इस लेख की अनुशंसा करता हूं शारीरिक संरचना और C++ के भीतर से ब्लॉग गेम से। वे # गंदगी को साफ करने के लिए एक व्यापक दृष्टिकोण की सलाह देते हैं:

दिशा-निर्देश

यहाँ लैक्स की पुस्तक से दिशानिर्देशों का एक आसुत सेट है जो फाइलों के बीच भौतिक निर्भरता की संख्या को कम करता है। मैं वर्षों से उनका उपयोग कर रहा हूं और मैं हमेशा परिणामों से खुश रहा हूं।.

  1. हर cpp फ़ाइल में पहले अपनी हेडर फ़ाइल शामिल होती है। [स्निप]
  2. एक हेडर फ़ाइल में उसे पार्स करने के लिए आवश्यक सभी हेडर फाइलें शामिल होनी चाहिए। [स्निप]
  3. एक हेडर फ़ाइल में नंबरों की न्यूनतम न्यूनतम संख्या होनी चाहिए जो इसे पार्स करने के लिए आवश्यक है। [स्निप]
2
Ben Martin

इस चर्चा को समाप्त करने के लिए: c ++ प्रीप्रोसेसर पूरा ट्यूरिंग है। यह एक शब्दार्थ संपत्ति है, चाहे कोई भी शामिल हो, अतिश्योक्तिपूर्ण है। इसलिए, यह राइस के प्रमेय से इस प्रकार है कि यह अनिर्दिष्ट है कि क्या कोई शामिल नहीं है या नहीं। वहाँ एक कार्यक्रम नहीं हो सकता है, कि (हमेशा सही ढंग से) पता लगाता है कि क्या कोई शामिल नहीं है।.

1
Algoman

यहाँ एक सरल शानदार बल के शीर्षलेख की पहचान करने का एक सरल बल तरीका शामिल है /। यह सही नहीं है, लेकिन "स्पष्ट" अनावश्यक को समाप्त करता है। इनसे छुटकारा पाना कोड को साफ करने में एक लंबा रास्ता तय करता है।.

स्क्रिप्ट्स को सीधे GitHub पर एक्सेस किया जा सकता है।.

1
ap-osd

हो सकता है कि थोड़ी देर हो गई, लेकिन मुझे एक बार एक WebKit पर्ल स्क्रिप्ट मिली, जो आपको चाहिए थी। मुझे लगता है मुझे विश्वास है कि कुछ अच्छा करने की आवश्यकता होगी (मैं पर्ल में अच्छी तरह से वाकिफ नहीं हूं), लेकिन यह चाल चलनी चाहिए:

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

(यह एक पुरानी शाखा है क्योंकि ट्रंक में अब फ़ाइल नहीं है)

1
rubenvb

वहाँ दो प्रकार की शानदार #include फाइलें हैं:

  1. एक हेडर फ़ाइल वास्तव में मॉड्यूल (.c .cpp) द्वारा बिल्कुल भी आवश्यक नहीं है
  2. मॉड्यूल द्वारा हेडर फ़ाइल की आवश्यकता होती है, लेकिन प्रत्यक्ष या अप्रत्यक्ष रूप से इसे एक से अधिक बार शामिल किया जाता है।.

मेरे अनुभव में 2 तरीके हैं जो इसका पता लगाने में अच्छा काम करते हैं:

  • gcc -H या cl.exe/showincludes (समस्या 2 का समाधान करें)

    वास्तविक दुनिया में, आप CFLAGS = -H को निर्यात कर सकते हैं, अगर सभी Makefile के CFLAGS विकल्प को ओवरराइड नहीं करते हैं। या जैसा कि मैंने इस्तेमाल किया, आप $-CC ($) और $ (CXX) के प्रत्येक आह्वान के लिए -H विकल्प जोड़ने के लिए cc/g ++ रैपर बना सकते हैं। और $ PATH वैरिएबल के लिए रैपर की डायरेक्टरी को प्रीपेन्ड करें, फिर आपका मेक इन बजाय आप रैपर कमांड का उपयोग करेंगे। बेशक आपके रैपर को असली gcc कंपाइलर लगाना चाहिए। अगर आपके Makefile सीधे gcc का उपयोग करता है तो इस ट्रिक्स को बदलना होगा। $ (CC) या $ (CXX) या निहित नियमों के बजाय।.

    आप कमांड लाइन के साथ ट्विक करके एकल फ़ाइल संकलित कर सकते हैं। लेकिन अगर आप पूरे प्रोजेक्ट के लिए हेडर साफ करना चाहते हैं। आप इसके द्वारा सभी आउटपुट कैप्चर कर सकते हैं:

    साफ करो

    बनाना 2> & 1 | टी परिणाम

  • PC- एक प्रकार का वृक्ष/FlexeLint (समस्या 1 और 2 दोनों को हल करें)

    सुनिश्चित करें कि + e766 विकल्प जोड़ें, यह चेतावनी इस बारे में है: अप्रयुक्त हेडर फाइलें।.

    pclint/फ्लिंट -vf ...

    यह पैक्लिंट आउटपुट को हेडर फ़ाइलों को शामिल करने का कारण बनेगा, नेस्टेड हेडर फाइलें उचित रूप से इंडेंट की जाएंगी।.

1
zhaorufei

जिम्पेल सॉफ्टवेयर पीसी लिंट जब एक फ़ाइल को एक संकलन इकाई में एक से अधिक बार शामिल किया गया है, तो रिपोर्ट कर सकता है, लेकिन यह उन फाइलों को शामिल नहीं कर सकता है जिनकी आपको जिस तरह से तलाश है, उसकी जरूरत नहीं है।.

संपादित करें: यह। देखिए इसके बारे में जवाब

0
crashmstr

CLION , C/C++ IDE JetBrains से, पता लगाता है कि निरर्थक आउट-ऑफ-द-बॉक्स शामिल हैं। ये संपादक में ग्रे-आउट हैं, लेकिन वर्तमान फ़ाइल या संपूर्ण प्रोजेक्ट में ऑप्टिमाइज़ शामिल के भी फ़ंक्शंस हैं।.

मैंने पाया है कि आप इस कार्यक्षमता के लिए भुगतान करते हैं; पहली बार लोड होने पर अपनी परियोजना को स्कैन और विश्लेषण करने के लिए CLion को कुछ समय लगता है।.

0
congusbongus