2010-10-22 4 views
9

को मैं // (C++) शैली में टिप्पणी कर रहा एक सी स्रोत फ़ाइल है। मैं सभी टिप्पणियों को पुराने /* */ (सी) शैली में बदलना चाहता हूं। क्या मौजूदा स्क्रिप्ट का उपयोग करके ऐसा करने का कोई तरीका है?बदलने टिप्पणियाँ C++ शैली से सी शैली

+1

क्या आप सी के प्री-सी 99 संस्करण का उपयोग कर रहे हैं? मेरे अनुभव और विकी पेज (http://en.wikipedia.org/wiki/C_(programming_language) के अनुसार) '// 'शैली टिप्पणियों को सी 99 आगे की अनुमति है। यदि कोडिंग मानक की लाइन लंबाई पर कोई सीमा है (उदा। Google कोडिंग स्टाइल अधिकतम 80 वर्णों की सिफारिश करता है), तो आपको इसके लिए भी देखना होगा। ऐसे मामले हो सकते हैं जैसे पीएमजी नीचे उल्लेख करता है। कुल मिलाकर, मुझे जानना उत्सुक है, आपकी प्रेरणा क्या है। – Arun

+2

ऐसा करने का एक अच्छा कारण यह है कि कोड को संकलित करने के लिए कोड प्राप्त करना है जो या तो सी ++ स्टाइल टिप्पणियों का समर्थन नहीं करते हैं या निर्दिष्ट सी संस्करण के साथ उनके बारे में शिकायत करते हैं। – nategoose

+0

मुझे जहां तक ​​संभव हो एएनएसआई-अनुपालन कोड लिखने की उम्मीद है। तो मैं उन सभी त्रुटियों की जांच कर रहा हूं जो 'gcc -ansi' चालू हो रहा है। –

उत्तर

14

आप के साथ एक प्रतिस्थापन पसंदीदा संपादक और s#//(.*)#/*\1 */# की तरह एक नियमित अभिव्यक्ति यह करना चाहिए ...

+1

बस 'x = 0 पर ध्यान दें; ///* एक्स = 1 था; */ऑफ-बाय-वन बग सही ' – pmg

+0

vi में मेरे लिए काम नहीं करता है (फेंकता नहीं है पैटर्न: //(.*) ') हैश क्या करता है? –

+2

@ एन 1.1: हैश सिर्फ प्लेसहोल्डर है, यह कोई चरित्र हो सकता है। यह आमतौर पर एक फॉरवर्ड स्लैश होता है, लेकिन जब आप अपने पैटर्न में स्लेश करते हैं, तो आपके सभी स्लेश से बचने के लिए एक अलग डिलीमीटर का उपयोग करना आसान होता है। 's/foo/bar /' 's # foo # bar #', 'sXfooXbarX', और' s, foo, bar, 'आदि के बराबर है। –

1

दुर्भाग्य से अधिकांश लिपियों केवल दूसरी तरह के आसपास काम करेंगे। "रिमोटमेंट" नामक एक सभ्य व्यक्ति है लेकिन यह सी लेता है और नई सी ++ स्टाइल टिप्पणियों में परिवर्तित होता है। मुझे लगता है कि ऐसा करने के लिए आपका कारण C++ शैली टिप्पणियों के साथ कंपाइलर त्रुटियों के कारण है। इसका सामान्य कारण एक रेखा है जो सी + शैली शैली टिप्पणी के साथ सी-स्टाइल टिप्पणी का उपयोग करती है। शायद उस विशेष परिदृश्य की तलाश में पुरानी शैली की टिप्पणी में वापस बदलने की आपकी आवश्यकता को खत्म कर दिया जाएगा। यदि नहीं, तो दुख की बात है कि आपको इसे हाथ से करना पड़ सकता है। (मैं प्रार्थना करता हूँ कि आप के रूप में मुझे पता है कि कैसे थकाऊ हो सकता है नहीं!)


recomment लिंक: http://people.sc.fsu.edu/~jburkardt/cpp_src/recomment/recomment.html

+0

जब मुझे इसकी आवश्यकता होती है तो मैं इसे ध्यान में रखूंगा। आप अपने उत्तर में रिमोटमेंट का लिंक प्रदान करना चाह सकते हैं। –

+1

लिपियों जो इसे दूसरे तरीके से करते हैं डरावनी हैं। '/ * foo */bar ++; लाइन नंबर बदलने के बिना सही ढंग से अनुवाद नहीं किया जा सकता है। – nategoose

+0

लिंक भूलने के लिए मैं क्षमा चाहता हूं! मैंने नीचे दिए गए लिंक के साथ अपना जवाब अपडेट कर दिया है! –

4

आप देख रहे हैं कुछ और भी अधिक सामान्य के लिए, आप भी एक स्रोत कोड स्वरूपण उपकरण का उपयोग कर सकता है इसके लिए। सी के लिए, मैंने पहले uncrustify का उपयोग किया है और यह काफी अच्छी तरह से काम करता है। अन्य भी हो सकते हैं, लेकिन मुझे लगता है कि अविश्वसनीयता C++ शैली टिप्पणियों को cmt_cpp_to_c पैरामीटर के साथ सी शैली टिप्पणियों में बदल सकती है।

विन्यास थोड़ा कठिन हो सकता है, लेकिन अगर आप सिर्फ उदाहरण कॉन्फ़िग फ़ाइल का उपयोग करें और केवल आपके द्वारा में रुचि रखते हैं बदलने के लिए, यह है कि तुम क्या चाहते हो सकता है।

1

आप इसे विम प्लगइन Nerdcommenter के साथ कर सकते हैं।

इससे पाठ uncomment और उसके बाद एक बहु लाइन टिप्पणी जोड़ने की तरह आप चाहते हैं के लिए बनाता है।

1

खैर, 1,$s#//\(.*\)#/*\1 */# अगर आप सी की ++ कोई उदाहरण है केवल काम करेंगे -, भीतर (आमतौर पर बहु ​​लाइन) सी-शैली टिप्पणियाँ शैली टिप्पणी के बाद से प्रतिस्थापन समय से पहले ही सी-शैली टिप्पणी खत्म हो जाएगा, के शेष भाग छोड़ने /* के बिना सी-स्टाइल टिप्पणी।

किसी भी नियमित रूप से सी ++ - शैली टिप्पणी कि है इसके भीतर */ भी समस्याएं होंगी। यह कोड में होता है जहां एक खराब प्रोग्रामर ने */ को समाप्त किए बिना सी-स्टाइल टिप्पणी को सी ++ शैली की टिप्पणी में बदल दिया।

1

यह सतह पर एक साधारण सी समस्या है, लेकिन एक बहुत ही मुश्किल समस्या सभी किनारे मामलों को संभालने के लिए है। सरल समाधान आसानी से sed में कार्यान्वित किया जाता:

sed -e 'sX// *\(.*[^ ]\) *$X/* \1 */X' <oldfile> newfile 

आप समायोजित कर सकते हैं कि जरूरत के रूप में: मैं इसे शुरू करने और टिप्पणी के अंत में सभी रिक्त स्थान खाने की है।

यह क्या संभाल नहीं करता है (के रूप में दूसरों का उल्लेख किया है) एम्बेडेड पुरानी शैली टिप्पणी के साथ नई शैली टिप्पणी है। यह वास्तव में गड़बड़ कर रहा है कि उनमें डबल-स्लेश के साथ तार हैं - वे टिप्पणी नहीं कर रहे हैं, लेकिन तारों को पार्स किए बिना, वे संशोधित होंगे जैसे कि वे थे। उन लोगों के लिए जाँच करें:

egrep '//.*/[*]|".*//' oldfile 

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