2010-04-07 23 views
24

क्या किसी को ऐसे टूल के बारे में पता है जिसे मैं कोड में स्पष्ट सी-शैली कास्ट खोजने के लिए उपयोग कर सकता हूं? मैं कुछ सी ++ कोड को दोबारा कर रहा हूं और जहां भी संभव हो वहां सी-स्टाइल कास्ट बदलना चाहता हूं।सी-स्टाइल को खोजने के लिए टूल

एक उदाहरण सी शैली डाली होगा:

Foo foo = (Foo) bar; 

सी के विपरीत उदाहरणों में ++ शैली डाले होगा:

Foo foo = static_cast<Foo>(bar); 
Foo foo = reinterpret_cast<Foo>(bar); 
Foo foo = const_cast<Foo>(bar); 
+0

सी-स्टाइल कास्ट क्या है? –

+1

ब्रैकेट्स में एक प्रकार, उदाहरण के लिए। (int) उदाहरण के लिए एफ – AshleysBrain

+1

@Bears (int) x। –

उत्तर

29

आप उपयोग कर रहे हैं जीसीसी/जी ++, बस सक्षम सी-शैली के लिए एक चेतावनी डाले:

g++ -Wold-style-cast ... 
+5

+1 सबसे अच्छा उपकरण और नौकरी के लिए सबसे आसान दृष्टिकोण का उपयोग करें ... अगर यह काम करता है। –

8

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

यह कहकर कि, सी -+ कोड में सी-स्टाइल के पास आपके पास मौजूद तथ्य यह है कि कोड के साथ समस्याएं इंगित होंगी - मैं केवल वैश्विक प्रतिस्थापन नहीं करूँगा, भले ही यह संभव हो।

+0

मुझे कोडिंग दिशानिर्देशों का पालन करना होगा :) – waffleman

+0

अधिकतर दिशानिर्देश टाइप किए गए नए कोड के लिए हैं। जब आवश्यक परिवर्तन होते हैं तो पुराना कोड केवल तभी किया जाएगा। उदाहरण के लिए एक फिक्स। बिना किसी लाभ के केवल समय (और धन) को रिफैक्टरिंग लागत के लिए रिफैक्टरिंग। – RvdK

+0

+1 जब आप आस-पास के कोड (और संभावित रूप से रीस्टस्टिंग) पर काम कर रहे/रीफैक्टर कर रहे हों तो उन्हें ठीक करें। –

5

नियमित अभिव्यक्ति के लिए खोज \)\w आश्चर्यजनक रूप से अच्छे परिणाम देता है।

+1

बिल्कुल मैं क्या सोच रहा था! http://xkcd.com/208/ – ewall

+2

यह केवल तभी काम करता है जब आप चर के बगल में कास्ट डालते हैं ... जो आपको हमेशा चाहिए, लेकिन हर कोई ऐसा नहीं करता है। –

0

सी-स्टाइल कास्ट के साथ एक मुद्दा यह है कि, क्योंकि वे ब्रांड्स पर भरोसा करते हैं जो कि ओवरलोड हो जाते हैं, वे स्पॉट करने के लिए तुच्छ नहीं हैं। फिर भी, एक regex जैसे (अजगर वाक्य रचना में उदा):

r'\(\s*\w+\s*\)' 

एक शुरुआत है - यह कोष्ठकों के अंदर वैकल्पिक सफेद स्थान के साथ कोष्ठक में एक भी पहचानकर्ता मेल खाता है। लेकिन निश्चित है कि पकड़ नहीं होगा, जैसे की, (void*) डाले -, तारक अनुगामी के साथ-साथ पाने के लिए

r'\(\s*\w+[\s*]*\)' 

तुम भी शुद्ध अभी भी आगे व्यापक बनाने के लिए एक वैकल्पिक const साथ शुरू कर सकता है, आदि, आदि

एक बार जब आप एक अच्छा आरई है, कई उपकरण (grep से vim, awk से sed करने, प्लस perl, python, ruby, आदि के लिए) आप इसे अपने स्रोत में अपने मैच के सभी की पहचान करने के लिए आवेदन की सुविधा देता है।

0

यदि आप किसी प्रकार की हंगेरी शैली नोटेशन (उदा। iInteger, pPointer इत्यादि) का उपयोग करते हैं तो आप उदाहरण के लिए खोज सकते हैं। )p और ) p और इसी तरह से।

यह उन सभी स्थानों को उचित समय में भी बड़े कोड बेस के लिए ढूंढना संभव होना चाहिए।

1

एक उपकरण जो सी ++ स्रोत कोड का सटीक विश्लेषण कर सकता है और स्वचालित कस्टम परिवर्तन (उदा।, आपका कास्ट प्रतिस्थापन) कर सकता है DMS Software Reengineering Toolkit है।

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

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

+8

जब आप अपना खुद का उत्पाद प्लग कर रहे हों तो आपको स्पष्ट रूप से आगे बढ़ना चाहिए। –

6

Offload C++ compiler ऐसे सभी जानवरों को संकलित समय त्रुटि के रूप में रिपोर्ट करने के विकल्प का समर्थन करता है, और इस तरह के कलाकारों के अर्थशास्त्र को static_cast के साथ एक सुरक्षित समकक्ष तक सीमित करने के लिए समर्थन करता है।

प्रासंगिक विकल्प हैं:

-cp_nocstylecasts 

संकलक सभी सी शैली डाले पर एक त्रुटि जारी करेगा। सी ++ कोड में सी-शैली का कारण संभावित रूप से असुरक्षित हो सकता है और अवांछित या अपरिभाषित व्यवहार का कारण बन सकता है (उदाहरण के लिए कास्टिंग पॉइंटर्स को असंबंधित संरचना/वर्ग प्रकारों में)। यह विकल्प उन सभी कोस्टों को खोजने के लिए रीफैक्टरिंग के लिए उपयोगी है और उन्हें स्थिर C++ के साथ static_cast जैसे स्थानांतरित करता है।

-cp_c2staticcasts 

संकलक सी शैली डाले पर लागू होता है सी ++ static_cast की बहुत सीमित अर्थ विज्ञान। इस विकल्प के साथ संकलित कोड यह सुनिश्चित करता है कि सी-स्टाइल कास्ट कम से कम सुरक्षित है जैसे सी ++ static_casts

यह विकल्प उपयोगी है यदि मौजूदा कोड में बड़ी संख्या में सी-शैली कास्ट होता है और सी ++ कास्ट में प्रत्येक कलाकार को दोबारा रिफैक्टर किया जाता है अत्यधिक प्रयास।

+0

ओह अच्छा! एक बार के लिए एक असली पार्सर :) –

0

मैं पहले से ही एक उपकरण के विवरण के साथ एक बार उत्तर दिया कि मिल जाएगा और परिवर्तन सब डाले अगर आप इसे चाहते हैं।

यदि आप करना चाहते हैं तो ऐसे जानवरों को ढूंढें, एक और उपकरण है जो इसे आसानी से करेगा, और वास्तव में यहां किए गए सभी "नियमित अभिव्यक्ति" सुझावों का अत्यधिक सामान्यीकरण है। वह SD Source Code Search Engine है। यह टूल प्रत्येक भाषा को बनाने वाले भाषा तत्वों के संदर्भ में बड़े कोड अड्डों को खोजने में सक्षम बनाता है। यह एक GUI प्रदान करता है जिसमें आप क्वेरी दर्ज करते हैं, व्यक्तिगत हिट देखते हैं, और एक माउस क्लिक के साथ हिट पॉइंट पर फ़ाइल टेक्स्ट दिखाते हैं। एक और क्लिक करें और आप एक फ़ाइल पर अपने संपादक [कई संपादकों के लिए] में हो सकते हैं। टूल संदर्भ में हिट की एक सूची भी रिकॉर्ड करेगा ताकि आप बाद में उन्हें फिर से देख सकें।

आपके मामले में, निम्नलिखित खोज इंजन क्वेरी डाले से अधिकतम लाभ उठाने की संभावना है:

'(' I ')' | '(' I ... '*' ')' 

जिसका अर्थ है, टोकन के एक अनुक्रम मिल जाए, पहले (, किया जा रहा है दूसरी किसी भी पहचानकर्ता, तीसरे किया जा रहा है 'किया जा रहा है) ', या एक समान अनुक्रम जिसमें' * 'में समाप्त होता है।

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

[मैं कंपनी है कि इस आपूर्ति पर सीटीओ हूँ।]

-1

मैं दृश्य स्टूडियो (2010) में इस रेगुलर एक्सप्रेशन का उपयोग फ़ाइलों खोज बॉक्स में खोजें: :i\):i

धन्यवाद प्रेरणा के लिए sth करने के लिए (his post)

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