2013-10-06 3 views
8

मैं g ++ (हाँ, उद्देश्य पर) के साथ कुछ सी कोड संकलित करने का प्रयास कर रहा हूं। मैं जैसे (उदाहरण के लिए) त्रुटियों हो रही है:'void *' से 'foo *' रूपांतरणों के लिए चेतावनियों को दबाने के लिए कैसे करें (-fpermissive द्वारा त्रुटियों से कम)

error: invalid conversion from 'void*' to 'unsigned char*' [-fpermissive] 

संकलन विकल्प के लिए -fpermissive जोड़ने मुझे हो जाता है:

error: invalid conversion from 'void*' to 'unsigned char*' [-Werror=permissive] 

जो एक की वजह से -Werror त्रुटि, तथापि में जोड़ने -Wno-error=permissive -Wno-permissive परिणाम हो रहा है:

error: -Werror=permissive: no option -Wpermissive 
error: unrecognized command line option "-Wno-permissive" [-Werror] 

शून्य * से अन्य सूचक प्रकारों के रूपांतरणों के लिए मैं चेतावनियां (ग्लोबली) कैसे अक्षम करूं?

+4

आप संकलक को ठीक कर सकते हैं या आप अपना कोड ठीक कर सकते हैं, 1 9 8 9 बहुत समय पहले था। अपने कोड में एक स्पष्ट (कास्ट) लिखकर आगे बढ़ें। –

+2

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

+2

(ठीक है, अपरिवर्तनीय रूप से स्टैक ओवरफ्लो रीडर टैग्स; अब के लिए हटाए गए 'C++' के रूप में संकलित करें।) मुझे दिलचस्पी है * विशेष रूप से * 'g ++' (कोई यादृच्छिक सी ++ कार्यान्वयन नहीं) इन चेतावनियों को अनदेखा करने के लिए और '-Wno- ' के बराबर 'अनुमोदित' के बराबर है। –

उत्तर

7

आप "को निष्क्रिय अन्य सूचक प्रकार के void* से रूपांतरण के लिए चेतावनी" कर सकता क्योंकि यह एक चेतावनी नहीं है - यह एक सिंटैक्स त्रुटि है।

यहाँ क्या हो रहा है कि आप -fpermissive उपयोग कर रहे हैं जो कुछ त्रुटियाँ डाउनग्रेड है - यह एक सहित - चेतावनी के लिए, और इसलिए आप संकलित करने के लिए अनुमति देता है कुछ गैर-अनुरूप कोड (जैसे लापता ब्रेसिज़ के रूप में वाक्यविन्यास त्रुटियों की स्पष्ट रूप से कई प्रकार के , चेतावनियों में डाउनग्रेड नहीं किया जा सकता है क्योंकि संकलक उन्हें नहीं समझ सकता कि उन्हें समझने योग्य कोड में बदलने के लिए उन्हें कैसे ठीक किया जाए)।

फिर, आप -Werror का भी उपयोग कर रहे हैं जो "चेतावनियों" सहित 0 चेतावनियों सहित सभी चेतावनियों को अपग्रेड करता है, जिसमें -fpermissive ने आपकी त्रुटि को बदल दिया है।

-Wno-error-Werror नकारना के लिए एक ही प्रयोग किया जाता है, अर्थात यह चेतावनी -Wno-error के साथ निर्दिष्ट है, जो चेतावनी के रूप में रहने के छोड़कर त्रुटियों के रूप में सभी चेतावनियों के इलाज के लिए -Werror कारण बनता है। चूंकि -W ध्वज बताता है, ये झंडे चेतावनियों के साथ काम करते हैं, इसलिए वे इस विशेष मुद्दे के साथ कुछ भी नहीं कर सकते हैं, क्योंकि आपके पास यहां त्रुटि है।इस तरह के अमान्य रूपांतरण के लिए कोई "चेतावनी" नहीं है जिसे आप -Werror के साथ बंद कर सकते हैं क्योंकि यह वास्तविक चेतावनी नहीं है - यह एक त्रुटि है कि -fpermissive केवल चेतावनी के रूप में माना जा रहा है।

आप संकलन कर सकते हैं अपने गैर comforming कोड, इस मामले में, -fpermissive और का उपयोग कर -Werror का उपयोग नहीं कर द्वारा। यह आपको अभी भी एक चेतावनी देगा, लेकिन सभी चेतावनियों की तरह, यह सफल संकलन को रोक नहीं पाएगा। यदि आप जानबूझकर गैर-अनुरूप कोड संकलित करने का प्रयास कर रहे हैं, तो -Werror का उपयोग करने से कोई मतलब नहीं है, क्योंकि आप जानते हैं कि आपके कोड में त्रुटियां हैं और इसलिए -fpermissive के साथ चेतावनियां भी होंगी, इसलिए -Werror निर्दिष्ट करने के बराबर है "कृपया मेरा संकलन न करें गैर-अनुरूप कोड, भले ही मैंने आपको अभी से पूछा है। "

चेतावनी दबाने के लिए g ++ प्राप्त करने के लिए सबसे दूर आप -fsyntax-only का उपयोग कर सकते हैं जो सिंटैक्स त्रुटियों की जांच करेगा और कुछ और नहीं, लेकिन जो आपके पास है वह एक वाक्यविन्यास त्रुटि है, जो आपकी मदद नहीं करेगा, और सर्वोत्तम आप कर सकते हैं कि -fpermissive द्वारा चेतावनी में बदल गया है।

+1

सटीक होने के लिए, यह रूपांतरण अर्थात् गलत है, वाक्य रचनात्मक रूप से नहीं, उदा। लापता ब्रेसिज़ या अब आरक्षित पहचानकर्ता। – user3125367

1

शून्य * से अन्य सूचक प्रकारों से रूपांतरणों के लिए चेतावनी (ग्लोबली) को मैं कैसे अक्षम कर सकता हूं?

वैसे इसे कंपाइलर के कोड के साथ सीधे बातचीत की आवश्यकता हो सकती है। यह शायद आप नहीं चाहते हैं। आप अपना कोड ठीक करना चाहते हैं। सबसे पहले, ये चेतावनियां नहीं हैं लेकिन त्रुटियां। आपको void* डालने की आवश्यकता है क्योंकि आप पहले इसे कास्ट किए बिना void* को किसी भी चीज़ में परिवर्तित नहीं कर सकते हैं (यह सी में संभव है हालांकि कम सी ++ के रूप में सुरक्षित है)।

उदाहरण के लिए आप

void* buffer = operator new(100); 
unsigned char* etherhead = static_cast<unsigned char*>(buffer); 
           ^
           cast 

करने के लिए की आवश्यकता होगी आप 100 unsigned char की एक गतिशील आवंटित बफर चाहते हैं तो आपको इस

unsigned char* p = new unsigned char[100]; 

कर रहे हैं और कलाकारों से परहेज बेहतर कर रहे हैं।

void pointers

+3

+1 यह शायद ध्यान दिया जाना चाहिए कि यह तब होता है जब आप सी ++ कंपाइलर के साथ सी कोड संकलित करते हैं। अकादमिक में जो पढ़ाया जाता है उसके विपरीत, एक * दूसरे * का एक सर्वव्यापी सबसेट नहीं है। (और 'static_cast (बफर)', btw।) – WhozCraig

+0

@WhozCraig वास्तव में उपयोग करें। मेरे पास वास्तव में एक अकादमिक है न केवल मुझे यह दावा करता है बल्कि सी ++ मानक से पूरी तरह से नकली, निर्मित उद्धरण के साथ इसे वापस लेता है, जो निश्चित रूप से वास्तव में वास्तविकता के विपरीत कहता है। – EJP

+1

वास्तव में यदि स्रोत सी है, तो उसके पास किसी भी नए की बजाय एक malloc() होगा। सी और सी ++ के बीच एक और * थोड़ा * अंतर। –

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

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