2009-07-16 11 views
14

मैं सी ++ में कुछ कोड दोबारा कर रहा हूं, और मैं कुछ पुराने तरीकों को हटाना चाहता हूं। सभी विधियों को ढूंढने के लिए मेरी वर्तमान विधि इस तरह दिखती है:सी ++ में एक फंक्शन के सभी कॉलर्स कैसे खोजें?

  1. स्रोत फ़ाइल में मूल विधि को टिप्पणी करें जिसमें मैं काम कर रहा हूं।
  2. कोड को संकलित करने का प्रयास करें।
  3. यदि कोई कंपाइलर त्रुटि मिली है, तो कॉल को नोट करें और पुनः संयोजित करने का प्रयास करें।
  4. एक बार संकलन सफलतापूर्वक पूरा हो जाने के बाद, मुझे सभी कॉल मिल गईं।

यह पूरी तरह से बेकार है। मैंने फ़ंक्शन कॉल के नाम के लिए स्रोत को grepping करने का भी प्रयास किया है, लेकिन मैं कभी-कभी अलग-अलग तर्कों के साथ समान नाम के कार्यों के साथ समस्याओं में भाग लेता हूं, इसलिए मेरा संकलन C++ संकलक मेरे लिए नाम हल करता है। मुझे सी # के लिए this question मिला है, लेकिन मेरा कोड बेस पूरी तरह से सी ++ में लागू किया गया है।

क्या क्लास विधि के सभी कॉलर्स या सी ++ में फ़ंक्शन खोजने का कोई बेहतर तरीका है? मैं यूनिक्स सिस्टम पर जीसीसी का उपयोग कर रहा हूं, लेकिन क्रॉस-प्लेटफार्म समाधान उत्कृष्ट होंगे।

+0

मुझे एक अच्छा समाधान सुनना अच्छा लगेगा, लेकिन ऐसा लगता है कि आपको पूरे फ्रंट एंड को डुप्लिकेट करना होगा। प्रतीक तालिका बनाने के लिए यह बहुत कुछ होगा। –

+1

कोशिश करें [CodeQuery] (https://github.com/ruben2020/codequery)। सी ++ की बेहतर स्रोत कोड जानकारी उत्पन्न करने के लिए यह सबसे अच्छा सीस्कोप और सीटीएजी मिला। अस्वीकरण: यह मेरा ओपन सोर्स प्रोजेक्ट है। – ruben2020

उत्तर

32

जीसीसी आपको __attribute__((deprecated)) के साथ चर, फ़ंक्शन और विधियों को सजाने की अनुमति देता है, जो सभी कॉलसाइट्स पर चेतावनी का कारण बनता है (जब तक -Wno-deprecated-declarations दिया जाता है)।

class A { 
public: 
    A() __attribute__((deprecated)) {} 
}; 
int main() { 
    A a; 
} 
 
$ g++ test.c 
test.cc: In function ‘int main()’: 
test.cc:6: warning: ‘A::A()’ is deprecated (declared at test.cc:3) 
+1

अच्छा। चूंकि ओक्यू जीसीसी (और अन्य प्लेटफार्मों का कोई उल्लेख नहीं है) का उपयोग कर रहा है, यही वह है जो मैं करता हूं। –

+8

दृश्य स्टूडियो का उपयोग करने वाले किसी भी व्यक्ति के लिए, #pragma बहिष्कृत (functionname) के साथ समान कार्यक्षमता है। Http://msdn.microsoft.com/en-us/library/044swk7y.aspx – Eclipse

+0

यह मेरे लिए सही जवाब है, क्योंकि मैं refactoring कर रहा हूँ मुझे क्रॉस-प्लेटफ़ॉर्म होने के गुणों की आवश्यकता नहीं होगी। अच्छी चीज़! –

2

यह काफी है कि मैं इसे कैसे करता हूं। यदि आपका कोड एक बार "grep" (या find | grep combo) में एक ही स्थान पर है तो यह चाल भी हो सकती है।

एक कैवियत: यह विधि अक्सर उन उदाहरणों को याद करती है जो आपके वर्तमान कॉन्फ़िगरेशन में सशर्त रूप से संकलित नहीं होती हैं। यदि आपका कोड एकाधिक कॉन्फ़िगरेशन का समर्थन करने के लिए #ifdefs का उपयोग करता है, तो एक संपूर्ण व्यक्ति सभी उदाहरणों को पकड़ने के लिए प्रत्येक कॉन्फ़िगरेशन के साथ संकलित करने का प्रयास करेगा।

+0

यह वास्तव में एक अच्छा मुद्दा है। सौभाग्य से हमारे पास हमारे कोड में बहुत से ifdef नहीं हैं, और मैं इस विशेष रिफैक्टरिंग प्रोजेक्ट के लिए कई लोगों की अपेक्षा नहीं करता हूं, लेकिन यही कारण है कि मुझे एक बेहतर चाल की आवश्यकता क्यों है। :) –

4

मुझे लगता है कि क्या आप चाहते हैं एक फोन ग्राफ को देखने के लिए है। इसे करने के तरीके के बारे में कुछ अच्छे सुझावों के लिए this question देखें।

+0

लिंक के लिए धन्यवाद! मैंने अपनी खोज में उस सवाल को नहीं देखा। –

6

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

मुझे पता है कि यह सी के लिए काफी अच्छी तरह से काम करता है, और वे दावा करते हैं सी ++ के लिए काम करता है। KScope इसके लिए एक केडीई जीयूआई फ्रंट एंड है। CallGraph View

+2

ड्रैट। मैं तब तक आशावादी था जब तक कि मैंने आपका "वे दावा नहीं करते कि यह सी ++ के लिए काम करता है"। आपकी पोस्ट के आधार पर, मैंने सोचा कि आप पहले हाथ अनुभव से बात कर रहे थे। मैं सी कोड के लिए सीएससीओपी का एक बड़ा प्रशंसक हूं, यहां तक ​​कि बड़ा, जटिल सी कोड, लेकिन मेरे पास सी ++ के साथ बहुत मिश्रित परिणाम हैं। मुझे लगता है कि शोक के बजाय मुझे सीएसकोप को ठीक करने की कोशिश करनी चाहिए, क्योंकि यह Sourceforge पर है ... – Dan

3

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

4

खिड़कियों के नीचे दृश्य स्टूडियो में ऐसा करने के लिए इच्छुक किसी के लिए ....

दृश्य सहायता वास्तव में अच्छा है:

10

ग्रहण किसी भी प्लगइन के बिना ऐसा कर सकता है। यह इस तरह की चीजों के लिए एक उपयोगी टूल हो सकता है भले ही आप इसे अपने दिन-प्रतिदिन के संपादक के लिए उपयोग नहीं करना चाहते हैं।

  1. Eclipse CDT डाउनलोड, इंस्टॉल और चलाएं।
  2. फ़ाइल, नई, सी ++ परियोजना के तहत जाएं। प्रोजेक्ट का नाम दर्ज करें और प्रोजेक्ट टाइप ट्री व्यू से रिक्त मेकफ़ाइल प्रोजेक्ट चुनें। "डिफ़ॉल्ट स्थान का उपयोग करें" अनचेक करें और उस फ़ोल्डर को दर्ज करें जहां आपकी प्रोजेक्ट रखा गया है।
  3. अगला क्लिक करें, फिर समाप्त क्लिक करें।
  4. ग्रहण स्वचालित रूप से आपके प्रोजेक्ट को अनुक्रमणित करना शुरू कर देगा। यदि यह वास्तव में मेकफ़ाइल प्रोजेक्ट है, और चूंकि आप g ++ का उपयोग कर रहे हैं, तो आप पूर्ण सफाई कर सकते हैं, फिर ग्रहण (प्रोजेक्ट मेनू के अंतर्गत) से बना सकते हैं, और इसे स्वचालित रूप से अपने मौजूदा मेकफ़ाइल का उपयोग करना चाहिए और स्वचालित रूप से अपनी निर्देशिकाएं और अन्य खोजना चाहिए परियोजना सेटिंग्स।
  5. किसी स्रोत फ़ाइल में ओवरलोडेड फ़ंक्शन का प्रोटोटाइप ढूंढें, उस पर राइट-क्लिक करें, संदर्भ चुनें, और प्रोजेक्ट चुनें। ग्रहण उस परियोजना के सभी संदर्भ पाएंगे, और केवल उस परियोजना के उस विशेष अधिभार के लिए, आपके प्रोजेक्ट के भीतर।

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

+1

सिमुल ने उत्तर दिया! मैं आपके अधिक पूर्ण उत्तर को रोकता हूं और आपको एक उपरोक्त के साथ पुरस्कृत करता हूं :-) –

2

आप Eclipse CDT सूचकांक अपने स्रोत आधार जाने हैं, तो आप किसी भी कार्य के लिए बुला पदानुक्रम देखने पर और भी कुछ पुनर्रचना के प्रदर्शन में सक्षम होना चाहिए।

आप download सी/सी ++ डेवलपर्स के लिए ग्रहण आईडीई (उम्मीद है कि आप अपने विशेष * एनआईक्स के लिए एक पोर्ट पा सकते हैं) और अपने instructions का पालन करने के लिए अनुसरण कर सकते हैं।

2

दृश्य स्टूडियो में, सही समारोह के नाम पर क्लिक करें और क्लिक करें "कॉल ब्राउज़र"> कॉलर्स ग्राफ़ दिखाएं

फिर प्रदर्शन विंडो में वहाँ एक फ़ोल्डर बुलाया जाना चाहिए "कार्य करने के लिए कॉल" सभी स्थानों में शामिल है कि कि उस फ़ंक्शन को कॉल करें, जिनमें से प्रत्येक आप कोड में उनके पास जाने के लिए डबल क्लिक कर सकते हैं।

+0

वीएस के नए निर्माण में, संदर्भ मेनू आइटम नामित कॉल पदानुक्रम है। –

+0

वीएस 2013 में ऐसा लगता है कि कॉल हाइराची देखें। – Watusimoto

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