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


289

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

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


1
इसे भी देखें: stackoverflow.com/questions/74326/…
ग्रहण

1
लिंक किए गए प्रश्न केवल विशेष रूप से विज़ुअल स्टूडियो का उपयोग करते हुए, विंडोज पर समस्या को संबोधित करते हैं।
डी। नबरे

7
इसे फिर से खोलने के लिए मतदान, क्योंकि डुप्लिकेट विज़ुअल स्टूडियो का उपयोग करने के बारे में है, विशेष रूप से।
आकर्षित डोरमैन

जवाबों:


42

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


5
यह जंजीरों को देखने का एक शानदार तरीका है .. ए -> बी -> सी -> डी और ए -> डी देखने से अतिरेक का तुरंत पता चलता है।
टॉम

34
@Tom: यह एक भयानक विचार है: एक के लिए यह नहीं दिखाता है कि क्या उन लोगों की जरूरत है या नहीं और दूसरे, शामिल की सूची में अप्रत्यक्ष पर निर्भर नहीं होना चाहिए जिसमें भविष्य में बदलाव शामिल हो सकते हैं (अनावश्यक रूप से शामिल हैं आमतौर पर ऐसा नहीं है) बड़ी समस्या वैसे भी, गार्ड और कंपाइलर मैजिक को शामिल करने के लिए धन्यवाद), लेकिन जिन वर्गों / कार्यों को वास्तव में फ़ाइल में उपयोग किया जाता है (आपके कंपाइलर को हज़ारों टेम्पलेट कोड की हजारों लाइनों से गुजरना चाहिए, जो तत्काल भी नहीं मिलते हैं)
माइकएम

@ अल्बर्ट, क्या आप इस के स्क्रीनशॉट को शामिल कर सकते हैं, और संक्षेप में वर्णन कर सकते हैं कि डॉक्स ऑक्सीजन आउटपुट में कहाँ क्लिक करें?
गेब्रियल स्टेपल्स

@GabrielStaples यह मेरा जवाब नहीं है, इसलिए मैं इसमें जानकारी नहीं जोड़ना चाहता। मैंने केवल लिंक को ठीक किया है (होस्टिंग स्थान के रूप में इसका उपयोग बंद / जब्त करने के लिए संदर्भित किया जाता है)।
अल्बर्ट

177

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

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

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


2
यह अब करता है। मैं अभी इसका इस्तेमाल शुरू कर रहा हूं। मेरा नोट यहां देखें। stackoverflow.com/questions/1301850/…
चांस

1
कैप्पलियन रिपॉजिटरी नीचे है, अब आप इसे यहां प्राप्त कर सकते हैं: bitbucket.org/robertmassaioli/cppclean (मूल साइट अभी भी कुछ उदाहरण उपयोग के लिए उपयोगी है)
निक

3
मैंने एक बनाए हुए कांटेदार कांटे के लिंक को अपडेट किया: github.com/myint/cppclean
BenC

1
ध्यान दें कि cppclean उन्हें केवल हेडर फ़ाइलों में लगती है, न कि cpp फ़ाइलों से, डॉक से: "हेडर फ़ाइलों में अनावश्यक #includes"।
Zitrax

1
@wizurd - मैंने ग्रहण सीडीटी में हाल के घटनाक्रमों के साथ नहीं रखा है, लेकिन मुझे ऐसा नहीं लगता। iwyu पूरी तरह से और अपेक्षाकृत धीमा है। ग्रहण सीडीटी का विश्लेषण तेज (इंटरेक्टिव) है और जब मैंने इसका परीक्षण किया तो कम सटीक था।
जोश केली

65

इसके अलावा जाँच करें कि क्या-आप उपयोग करते हैं , जो एक समान समस्या हल करता है।


6
IMHO के इस जवाब को और अधिक बढ़ाने की आवश्यकता है, क्योंकि एक बार जब किंक को काम किया जाता है तो Google का IWYU टूल इस कार्य के लिए निश्चित उपकरण होगा।
दान ओल्सन

5
sudo apt-get install iwyu
एंड्रयू वैगनर

बहुत अच्छा लगता है - दो कैवेट्स के साथ 1) अंतिम अपडेट फ़रवरी 2106 2) गोगोल खुद इसका उपयोग केवल सी ++ के लिए करते हैं, सी नहीं, जो ओपी ने अनुरोध किया था।
मावग का कहना है कि मोनिका सेप

क्या आप थोड़ा समझा सकते हैं कि उपयोगकर्ता को इसका उपयोग कैसे करना चाहिए? अजगर स्क्रिप्ट के आउटपुट में क्या है, इस बारे में README बहुत स्पष्ट नहीं है।
किंग्स जस्टर

मैं इसका उपयोग कर रहा हूं, लेकिन यह हमेशा 100% सही नहीं है। शायद 70% बार यह सही सुझाव देता है।
इनक्यूसिटिव

25

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

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

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


8
इसमें से कोई भी एक समस्या नहीं होगी यदि सम्मिलित फ़ाइलें अच्छी तरह से रखी गई हैं। यदि आपको कभी फ़ाइल B से पहले फ़ाइल A को शामिल करने की आवश्यकता होती है, तो आप इसे गलत कर रहे हैं (और मैंने उन परियोजनाओं पर काम किया है जहाँ उन्होंने इसे गलत किया था)।
डेविड थॉर्नले

9
@ डेविड, हाँ, लेकिन यह सही ढंग से करने से पहले देवों के वर्षों पर निर्भर करता है। मैं महान निश्चितता के साथ कह सकते हैं कि कि हो रहा है की संभावना घर के पक्ष में है, न कि आप :(
JaredPar

हां, लेकिन मुझे आमतौर पर इस बारे में पता चलता है कि किसी कार्यक्रम को संशोधित करते समय, और अचानक मुझे एक संकलन त्रुटि मिली है (यदि मैं भाग्यशाली हूं) या अस्पष्ट बग। ऐसा लगता है कि कम से कम लंबे समय में #include फ़ाइलों को ईमानदार बनाए रखना है।
डेविड थॉर्नले

मैं ठीक इसके विपरीत कहूंगा। आप सभी की जरूरत है एक प्रकार पर निर्भरता चेकर है। यह आपके द्वारा व्यवस्थित किए जाने के अनुसार संकलित नहीं हो सकता है, लेकिन ये ऐसी समस्याएं हैं जिनसे किसी भी तरह निपटा जाना चाहिए।
बेनोइट

1
@ बेनोइट, तो आप उन मुद्दों की एक श्रेणी की अनदेखी कर रहे होंगे जो आपके कार्यक्रम के अर्थ को संकलित करते हैं लेकिन बदलते हैं। विचार करें कि एक फ़ाइल में एक #define दूसरे में #if शाखा को कैसे बदल सकता है। हेडर को
हटाकर

15

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

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


अच्छा खोजो! मुझे वह प्रयोग करना पड़ेगा।
दुर्घटनाग्रस्त हो गया

4
मैं नियमित रूप से PCLint का उपयोग करता हूं और यह मुझे अप्रयुक्त हेडर के बारे में बताता है। मैं शीर्ष लेख #include और फिर से संकलित करने के लिए सावधान हूं, यह सुनिश्चित करने के लिए कि हेडर वास्तव में अप्रयुक्त है ...
हेरोल्ड बैमफोर्ड

पुष्टि के लिए धन्यवाद, हेरोल्ड।
इसका मर्म

5
बहुत महंगा। जनता के लिए व्यवहार्य उपकरण नहीं है।

7

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


5

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

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

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


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

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

1
इस बात से सावधान रहें - कहते हैं कि दो हेडर फाइलें हैं जिनमें दोनों में कुछ की परिभाषा शामिल है। आप दोनों को हटा सकते हैं, लेकिन दोनों को नहीं। आपको अपने ब्रूट बल दृष्टिकोण में थोड़ा और पूरी तरह से होने की आवश्यकता होगी।
डोमिनिक रॉजर

शायद यह वही है जो आप का मतलब है, लेकिन एक स्क्रिप्ट जो एक एकल को हटाती है, और अंतिम हटाए गए को शामिल करती है यदि इसे सफलतापूर्वक हटा दिया गया तो यह चाल चलेगी।
डोमिनिक रॉजर

1
बुरा विचार। यदि कोई हेडर फ़ाइल # BLF को एक निरंतर BLAH बनाता है और दूसरी हेडर फ़ाइल #ifdef BLAH की जांच करती है, तो पहली हेडर फ़ाइल को हटाना अभी भी सफलतापूर्वक संकलित हो सकता है लेकिन आपका व्यवहार बदल गया है।
ग्रीम पेरो

1
यह सिस्टम हेडर के साथ भी समस्याएं पैदा कर सकता है, क्योंकि अलग-अलग कार्यान्वयनों में #include <वेक्टर> में शामिल विभिन्न चीजें हो सकती हैं। यहां तक ​​कि अगर आप एक संकलक से चिपकते हैं, तो हेडर विभिन्न संस्करणों में बदल सकते हैं।
डेविड थॉर्नले

2
यह उन मामलों को नहीं खोजेगा जिनमें आप एक हेडर शामिल कर रहे हैं जिसमें हेडर शामिल है जिसकी आपको वास्तव में आवश्यकता है।
bk1e

5

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

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

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


मुझे पता है कि आपका क्या मतलब है, और मेरी प्रतिक्रिया "Ewwww" थी। मुझे उस कोड से नफरत है।
डेविड थॉर्नले

5

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


4

मैंने 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. एक हेडर फ़ाइल में पार्स करने के लिए आवश्यक न्यूनतम हेडर फाइलें होनी चाहिए। [स्निप]

लैकोस की पुस्तक शिक्षा के लिए महान है - एक तरफ संकलक तकनीक पर उनकी पुरानी टिप्पणियों से।
टॉम

4

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


इसका कारण यह है कि हमारा बहीखाता विभाग कम मात्रा में चालान नहीं कर पा रहा है। यदि आप समय की गणना करते हैं तो आप इसे सहेज सकते हैं यह अनुचित नहीं है। एक बार, हमें क्रेडिट कार्ड भुगतान प्राप्त करने की क्षमता मिल गई है जिससे हम कीमत को काफी कम कर सकते हैं। एक अन्य विकल्प हमारे विकास प्रयासों के लिए एक प्रायोजक होगा। हमारे वित्तपोषण मॉडल को हमें अपने शोध कार्य के वित्तपोषण के लिए लाभ प्राप्त करने की आवश्यकता है। मैं बहुत सस्ता लाइसेंस बेचकर खुश होऊंगा, लेकिन नहीं कर सकता। हो सकता है कि हम इसे सीडीटी में योगदान दें और आप इसे मुफ्त में प्राप्त करें, लेकिन मुझे किसी तरह वित्त देना होगा। मैं भूल गया, आप मुफ्त में कोशिश कर सकते हैं!
पीटरसम

2

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


1
स्क्रिप्ट कुछ को हटाने के लिए शामिल है, लेकिन यह भी शामिल है कि हटाया नहीं जा सकता का एक बहुत कुछ देता है। ऐसा लगता है कि यह क्लास एनम का समर्थन नहीं करता है, यह भी लगता है कि यह मैक्रो के साथ और कभी-कभी नेमस्पेस के साथ एक बुरा समय है।
बैप्टिस्ट विच

1

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

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

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



1

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

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

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

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

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

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

    साफ करो

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

  • PC-Lint / FlexeLint (समस्या का समाधान 1 और 2 दोनों)

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

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

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


1

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


5
क्या मैंने "हमेशा सही" समाधान के लिए पूछा था? यह उत्तर चर्चा के लिए बहुत उपयोगी नहीं है।
शौच

1
वैसे समस्याओं पर चर्चा करने वाले ऐसे कई पद हैं जिनसे इस तरह के कार्यक्रम को निपटना होगा। मेरी पोस्ट चर्चा के उस हिस्से का निर्णायक और सही उत्तर देती है। और मैं एक के लिए इसे पसंद नहीं करूंगा, अगर एक कार्यक्रम ने मुझे बताया, तो मैं सुरक्षित रूप से एक #include निकाल सकता था और फिर मेरा कोड अब संकलित नहीं करता है। (या बदतर - अभी भी संकलन करता है लेकिन कुछ अलग करता है)। ऐसा कोई भी कार्यक्रम इस जोखिम को सहन करता है।
अल्गोमन

4
कितना मुश्किल होगा और आप एक बाधा या किसी अन्य को कैसे हल करेंगे, इसके बारे में सभी विवरणों के बीच, मैंने आपको केवल 100% सही उत्तर दिया। मुझे यह कहते हुए काफी
अचंभा

1
मुझे याद आया कि राइस के प्रमेय में कहा गया है, "कोई ऐसा कार्यक्रम नहीं हो सकता है जो हमेशा जाँच सकता है कि क्या कोई दिया गया प्रोग्राम इस अतिशयोक्तिपूर्ण समस्या को हल करता है"। कुछ कार्यक्रम हो सकते हैं जो अति-समस्याग्रस्त समस्या को हल करते हैं।
झेज यांग

1
व्यक्तिगत रूप से मुझे @ अल्गोमन का इनपुट बहुत मददगार लगा। मुझे एहसास कराता है कि यह समस्या कितनी कठिन है।
बोगार्डन

1

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

स्क्रिप्ट GitHub पर सीधे पहुँचा जा सकता।


0

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

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


क्या आप इसके बारे में निश्चित हैं? मैंने C ++ कोड पर कुछ वर्षों में FlexeLint (PCL के समान) का उपयोग नहीं किया है, लेकिन हाल ही में C कोड पर भी, मैं कसम खा सकता हूं कि मैंने अप्रयुक्त हेडर फ़ाइलों के बारे में एक युगल संदेश देखा (मुझे लगता है कि यह कोड 766 है?)। बस जाँच की गई (v8.0), खंड 11.8.1 देखें। मैनुअल का।
दान

0

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.