2012-02-21 5 views
9

मुझे कुछ (विरासत) कोड मिला है जिसे मैं पहली बार क्लैंग के साथ बना रहा हूं।क्या क्लैंग के साथ ट्रिगर को अक्षम करने के लिए कोई स्विच है?

sprintf(buf, "%s <%s ????>", p1, p2); 

बजना निम्नलिखित चेतावनी (-Werror साथ त्रुटि) देता है:: कोड कुछ की तरह है

test.c:6:33: error: trigraph converted to '}' character [-Werror,-Wtrigraphs] 
    sprintf(buf, "%s <%s ????>", p1, p2); 
         ^

जाहिर ??> एक trigraph के रूप में इरादा नहीं है, तो मैं पूरी तरह से trigraphs अक्षम करना चाहते हैं (स्रोत जानबूझकर उन्हें कहीं भी उपयोग नहीं करता है)।

मैं -no-trigraphs की कोशिश की है लेकिन वह वास्तव में एक विकल्प नहीं है:

clang: warning: argument unused during compilation: '-no-trigraphs' 

मैं trigraphs -Wno-trigraphs साथ चेतावनी बंद कर सकते हैं, लेकिन मैं नहीं करना चाहती trigraph वास्तव में रूपांतरण बिल्कुल जगह लेने के लिए।

नोट: ट्रिग्राफ को -std=c89 का उपयोग करने के अनपेक्षित दुष्प्रभाव के रूप में सक्षम किया गया था।

+2

ओच! जीसीसी के पास सख्त अनुपालन मोड में भी ट्रिग्राफ को अनदेखा करने की एक समझदार नीति है, जब तक कि आप '-ग्रीग्राफ' के साथ आग में हाथ न रखें। 'Sed' तोड़ने का समय? या समकक्ष। –

+3

वास्तव में जीसीसी के सख्त अनुपालन मोड ('-std = c89',' -std = c99', आदि) ट्रिगर रूपांतरण चालू करते हैं। – zwol

+1

और यदि कोई सोच रहा है कि डब्लूटीएच एक ट्रिगर है। [यहां टट्टू है] (http://stackoverflow.com/questions/7825055/what-does-the-c-operator-do) ... – Mysticial

उत्तर

6

gnu * मोड का उपयोग कर प्रयास करें - "gnu * मोड में बंद किया जा रहा करने के लिए Trigraphs डिफ़ॉल्ट, वे -trigraphs विकल्प सक्षम कर सकते हैं।" (अन्य अंतर और कमांड लाइन स्विच के लिए http://clang.llvm.org/docs/UsersManual.html#c_modes देखें)

+0

आह, वह था! मैं '-std = c89' का उपयोग कर रहा था, लेकिन '-std = gnu89' के साथ मुझे संदेश' त्रुटि मिली: ट्रिगर ने अनदेखा किया [-Werror, -Wtrigraphs] 'जिसे मैं' -वनो-ट्रिग्राफ 'के साथ अक्षम कर सकता हूं। –

+2

क्या gnu एक्सटेंशन को सक्षम किए बिना ट्रिगर को अक्षम करने का कोई तरीका है? – bames53

4

मैं ट्रिग्राफ को अक्षम करने के लिए एक स्पष्ट तरीका नहीं देख सका (ट्रिगर चेतावनी के बजाए)। शायद इस कोड को ठीक करने के लिए सबसे आसान तरीका करने के लिए इसे बदलने के लिए है:

sprintf(buf, "%s <%s ????"">", p1, p2); 
+0

यह एक उचित विकल्प की तरह लगता है। स्रोत की लाखों लाइनों में से, '??>' केवल चार बार होता है। –

+0

'" ... ??? \?> "'भी काम करना चाहिए। ट्रिग्लैश को ट्रिग्राफ के दो प्रश्न चिह्नों के बीच रखें। – zwol

+0

चूंकि ट्रिग्राफ कहीं भी दिखाई दे सकते हैं, शायद 'sed "s/?? \ ([- <>() \/= #'] \) /? \\? \ 1/g" 'किसी भी ट्रिग्राफ को एक सुरक्षित अनुक्रम में परिवर्तित करने के लिए । दूसरी ओर, एक स्ट्रिंग के बाहर, शायद ट्रिगर को अपने मानक रूप में सबसे अच्छा रूपांतरित कर दिया जाएगा? यह तय करने में थोड़ा मुश्किल हो जाता है कि सबसे अच्छा क्या है। (बस एक बार के लिए, मेरी 'sed' स्क्रिप्ट पैटर्न के चारों ओर डबल कोट्स का उपयोग करती है, क्योंकि पैटर्न में एक ही उद्धरण है।) –

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

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