2010-07-31 8 views
6

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

.c फ़ाइल में फ़ंक्शन घोषणाओं को .h फ़ाइल में उनके प्रोटोटाइप के रूप में उसी क्रम में फ़ंक्शन घोषणाओं को रखने का कोई तरीका है? मैं .h फ़ाइल पढ़ने के लिए एक टूल की तलाश में हूं (यदि संभव हो तो #pragma mark एस के साथ) और .c फ़ाइल को संगत रूप से पुन: क्रमबद्ध करें।

संभव है?

+0

यह उपकरण '.c' फ़ाइल में तत्वों के साथ क्या करना चाहिए जिसमें '.h' फ़ाइल में कोई समान तत्व नहीं है? उदाहरण के लिए, स्थिर कार्य वैश्विक कार्यों से संबंधित हो सकते हैं और उनके पहले या बाद में स्थित हो सकते हैं। – jilles

+0

यह आवश्यकताओं की सूची पर नहीं है। यदि उपरोक्त आवश्यकताओं को पूरा करने वाला कोई उपकरण मौजूद है, तो मुझे यकीन है कि यह इस मामले को संभालने में सक्षम होगा। – Joe

उत्तर

1

मैंने पहले कोड shredding किया है। सबसे नज़दीकी चीज जो आपको मिल सकती है वह लिखना है (जहां तक ​​मुझे पता है)। एक स्थिर विश्लेषण API का उपयोग करके, आप अपने स्रोत कोड को पार्स कर सकते हैं, और फिर प्रत्येक शीर्षलेख फ़ाइल में कोड पर आधारित सभी फ़ाइलों को संबंधित .c फ़ाइल में व्यवस्थित कर सकते हैं।

SciTools नामक एक कंपनी को स्रोत कोड विश्लेषक को 'समझें 4 सी ++' कहा जाता है जिसमें सी एपीआई है जो इसे बहुत आसान बनाता है। लेकिन आपको शायद स्वयं को टूल लिखना होगा। जैसा कि है, मैंने एक प्रबंधित एपीआई लिखा जो उनके सी एपीआई के शीर्ष पर बैठता है। मेरा प्रबंधित कोडप्लेक्स पर यहां पाया गया है: http://understandapi.codeplex.com/

यहां बताया गया है कि मैं प्रोग्राम की संरचना कैसे करूं।

  1. सबसे पहले आपको अपने सभी स्रोत कोड का डेटाबेस बनाना होगा। यदि आप चाहें तो बैच स्क्रिप्ट का उपयोग करके ऐसा कर सकते हैं, या पावरहेल स्क्रिप्ट, या आप इसे स्वयं मैन्युअल रूप से कर सकते हैं। यह आमतौर पर एक निर्देशिका को इंगित करने के रूप में सरल होता है और असल में कहता है कि 'वहां सभी फाइलों का डेटाबेस बनाएं'। आप यह निर्धारित कर सकते हैं कि आप अपने डेटाबेस में * .c, * .h, या * .cpp फ़ाइलों को चाहते हैं या नहीं।

  2. फिर API का उपयोग करके आप .h फ़ाइल एक्सटेंशन के साथ सभी फ़ाइलों को ब्राउज़ कर सकते हैं।

  3. प्रत्येक शीर्षलेख फ़ाइल के लिए, आप सत्यापित करते हैं कि एक संबंधित .c फ़ाइल है। यह फ़ाइल एक्सटेंशन की एक स्ट्रिंग ले कर, फ़ाइल एक्सटेंशन को बदलकर किया जाता है (.NET यह आसान बनाता है), और फ़ाइल मौजूद है या नहीं। यदि यह अस्तित्व में है, तो अगले चरण पर।

  4. फिर प्रोग्राम को .h फ़ाइल में सभी परिभाषित इकाइयों के माध्यम से पुनरावृत्त करना चाहिए।

  5. प्रत्येक इकाई के लिए, फिर उसे इसकी परिभाषा (घोषणा नहीं) का संदर्भ मिलता है, और देखें कि यह संबंधित .c फ़ाइल में मौजूद है या नहीं। यदि यह वहां है, तो यह कोड परिभाषा की रेखा संख्या पाता है, और फ़ाइल को पढ़ने के लिए खोलता है, और कोड की आवश्यक पंक्तियां (और टिप्पणियां भी) पढ़ता है और उन्हें एक अस्थायी फ़ाइल में लिखता है।

  6. पूरा होने पर, अस्थायी फ़ाइल के साथ .c फ़ाइल को ओवरराइट करें।

  7. डेटाबेस में शेष फ़ाइलों के लिए आगे बढ़ें।

अब यह इतना आसान नहीं है। आप के रूप में रास्ते में परेशानी में भाग सकते हैं 1. सशर्त रूप से संकलित कोड, इस मामले में यह पार्स करना मुश्किल हो जाएगा, हालांकि यह संभव है।4 सी ++ को समझें सशर्त संकलन निर्देशों को पार्स करता है और निष्क्रिय और सक्रिय कोड के बीच अंतर करता है। लेकिन सिर्फ इसे संभालने से यह वास्तव में मुश्किल हो जाएगा। 2. नामस्थान - यह मामलों को जटिल करेगा।

हालांकि यदि आप केवल कुछ #pragma निर्देशों के बीच कोड व्यवस्थित करने में रुचि रखते हैं, तो यह फिर से मामलों को सरल बना सकता है।

मुझे बताएं कि क्या आप अधिक रुचि रखते हैं, और हम निजी तौर पर एक बात करते हैं।

+0

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

+0

चलो देखते हैं, यह टूल सी भी करता है। यह मुझे लगता है कि एडीए, जावा, सी #, फोरट्रान, और कुछ और भी करता है। यह भी कई ऑपरेटिंग सिस्टम पर चलता है। –

1
  • एक अच्छा आईडीई का उपयोग करें ... ऑर्डर फ़ाइल/सी फ़ाइल में ऑर्डर रखने की आवश्यकता नहीं होगी।

  • यदि वह अभी भी आपको सुइट नहीं करता है ... वर्णमाला क्रम में सभी घोषणाओं और परिभाषाओं को रखें। जब आप कोई नया फ़ंक्शन जोड़ते हैं, तो आप जानते हैं कि नया फ़ंक्शन कहां डालें।

    पीएस मैं http://www.dmoz.org/ में विश्वास कह ::

    Humans Do it better 
    
+0

मनुष्य इसे बेहतर (बहस योग्य) कर सकते हैं, लेकिन वे धीमे और रास्ते अधिक महंगे हैं! – Christo

+0

'एक अच्छा आईडीई' का उपयोग करके क्या आपका मतलब है कि स्रोत कोड के आसपास कूदने में सक्षम बनाता है? मैं एक्सकोड में लिख रहा हूं जो ठीक है, लेकिन मैं चाहता हूं कि कोड किसी भी प्लेटफॉर्म पर टेक्स्ट एडिटर में पठनीय हो। मैं पाठक के जीवन को आसान बनाने के लिए उत्पादन के अंत में काम को कंधे में रखना चाहूंगा, 'एक अच्छा आईडीई का उपयोग न करें' कहें। – Joe

+0

और आपके दूसरे बिंदु के बारे में, मैं एक निश्चित क्रम में कार्यों को डाल रहा हूं, उदाहरण के लिए एडीटी, दृढ़ता, एडीटी पर संचालन आदि का निर्माण/विनाश आदि। कृत्रिम आदेश योजना, जैसे वर्णमाला, का पालन करना आदर्श नहीं है। – Joe

1

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

मेरी कंपनी के DMS Software Reengineering Toolkit का उपयोग इस भरोसेमंद मॉड्यूलो को एक चेतावनी करने के लिए किया जा सकता है।

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

चेतावनी प्रीप्रोसेसर निर्देशों वाले पार्सिंग स्रोत कोड के साथ करना है: उन्हें अच्छी तरह से संरचित होना चाहिए [उदाहरण के लिए। #ifdef #endif को बयान सीमा में उपयोग किए जाने के विपरीत नियमित जैसे अन्य बयानों के आसपास घोंसला करने की आवश्यकता है। यह सी कोड में कुछ होता है; सी ++ कोड में कम है। हमारा अनुभव यह है कि यदि आप अपने सी कोड को थोड़ा सा संशोधित करने के इच्छुक हैं, आप इस विशेष मुद्दे को दूर कर सकते हैं।

अपने विशिष्ट कार्य के लिए, आप वैज्ञानिक Toolworks के लिए जवाब के रूप में काफी वर्णित कार्य करें:

  1. एक संकलन इकाई चुनें, और डीएमएस का उपयोग कर इसे पार्स। आपको सभी समान जानकारी प्रदान करना है, जो आप कंपाइलर प्रदान करते हैं, इसलिए यह हेडर फाइलों का पता लगा सकता है, आदि
  2. डीएमएस आपके संकलन इकाई और सभी शीर्षलेख फ़ाइलों दोनों के लिए एएसटी उत्पन्न करता है।
  3. हेडर और संकलन इकाई में घोषणाओं के क्रम निकालने के लिए एएसटी चलाएं।
  4. पुनर्गठन संकलन इकाई पेड़ 3 से प्राप्त आदेश)
  5. Prettyprint जिसके परिणामस्वरूप संकलन इकाई एएसटी

[बल्कि वैज्ञानिक Toolworks से डीएमएस के साथ ऐसा करने का एक कारण है कि डीएमएस लिए बनाया गया है के अनुसार पार्स/ट्रांसफॉर्म/कोड पुन: उत्पन्न करें, जबकि SciTool IMHO वास्तव में केवल को पार्स करने और विश्लेषण करने के लिए डिज़ाइन किया गया है। डीएमएस विज्ञान के लिए आवश्यक बढ़िया विवरण तक पहुंच प्रदान करता है, कम से कम आखिरी बार मैंने देखा नहीं है] SciTools नहीं करता है।

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

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

+1

मुझे कभी-कभी इस डीएमएस पर अपना हाथ मिलना अच्छा लगेगा। मैं एससीआई के एपीआई से घनिष्ठ परिचित हो गया हूं, लेकिन मैं हमेशा इस सामान की मेरी समझ को विस्तारित करने के तरीकों की तलाश में हूं। –

संबंधित मुद्दे

 संबंधित मुद्दे