दिलचस्प पोस्ट
रद्दी और अंडरस्कोर के बीच अंतर एनएसडीट 5 घंटे बंद है फोनगैप InAppBrowser प्रदर्शन पीडीएफ 2.7.0 वहाँ कोई अच्छा Markdown जावास्क्रिप्ट पुस्तकालय या नियंत्रण है? आर के साथ JSON पार्स करें चार * str = "STRING" के बीच अंतर और चार अक्ष = "STRING"? स्थिति पट्टी पर नेविगेशन ड्रॉवर अर्द्ध-पारदर्शी काम नहीं कर रहा है जावा, समान पंक्ति में किसी अन्य कक्ष के फ़ंक्शन के रूप में एक सेल सामग्री परिवर्तित करें UITableView dequeueReusableCellWithIdentifier थ्योरी जावा प्रयास-अंत में डिजाइन प्रश्न वापस आ गया एंड्रॉइड पूरी तरह से पारदर्शी स्टेटस बार? सीएसएस एक-दूसरे के बगल में दो डिवाईज क्या कोई जावास्क्रिप्ट / jQuery DOM परिवर्तन श्रोता है? जावा – मैं एक फ़ाइल में मेरा ArrayList कैसे लिख सकता हूँ, और पढ़ें (लोड) जो मूल ArrayList पर फ़ाइल है? पायथन प्राइम नंबर चेकर

मैं चेतावनियों को कैसे ठीक कर सकता हूं: "हस्ताक्षरित और अहस्ताक्षरित के बीच तुलना"?

मुझे जीसीसी के साथ निम्नलिखित विकल्पों का उपयोग करने की सलाह दी गई है, क्योंकि यह कई सामान्य त्रुटियों से बचने में मदद करता है यह चेतावनियों का एक गुच्छा मुड़ता है और -Werror उन्हें त्रुटियों में बदल देता है

 gcc -pedantic -W -Wall -Wextra -Wshadow -Wstrict-overflow=5 -Wwrite-strings -std=c99 -Werror 

निम्नलिखित परीक्षण कोड को देखते हुए:

 #include <stdio.h> int main(void) { int arr[8]={0,10,20,30,40,50,60,70}; int x; printf("sizeof(arr): %d\n", sizeof(arr)); printf("sizeof(int): %d\n", sizeof(int)); for(x = 0; x < sizeof(arr)/sizeof(int); x++) { printf("%d\n",arr[x]); } return 0; } 

मैंने इसे प्राप्त किया:

 test.c:11: error: comparison between signed and unsigned 

मुझे पता है कि एक तरह से मैं इसे ठीक कर सकता हूँ चेतावनियों को बंद कर रहा है, लेकिन उन्होंने मुझे इन सेटिंग्स का इस्तेमाल अंत में उन्हें बंद करने के लिए नहीं किया है

एक और तरीका है सामान डालना, लेकिन मुझे बताया गया है कि ढलाई अप्रयुक्त है।

इसके अलावा, मैं एक्स को एक unsigned int में बना सकता हूं:

 unsigned x; 

लेकिन यह सामान्य समस्या का समाधान नहीं करता है जब मुझे इन कंपाइलर विकल्पों के उपयोग से हस्ताक्षरित मूल्यों के साथ हस्ताक्षरित मूल्यों की तुलना करना पड़ता है। क्या कास्टिंग के बजाय एक क्लीनर तरीका है?

वेब के समाधान से एकत्रित समाधान "मैं चेतावनियों को कैसे ठीक कर सकता हूं: "हस्ताक्षरित और अहस्ताक्षरित के बीच तुलना"?"

यह वास्तव में डेटा प्रकार पर निर्भर करता है। हस्ताक्षर किए और अहस्ताक्षरित प्रकार में उपलब्ध सभी मूल्यों के एक सुपरसेट में एक प्रकार के मूल्यों का परस्पर मूल्य डालने से यह संभव है। उदाहरण के लिए आप एक हस्ताक्षरित 32 बिट और हस्ताक्षरित 32 बिट मान की तुलना करने के लिए 64 बिट हस्ताक्षरित मूल्य का उपयोग कर सकते हैं।

हालांकि यह एक कोने केस है और आपको अपने प्रकार के आकार को सत्यापित करने के लिए कार्य करना है। आपका सबसे अच्छा समाधान दोनों ऑपरेटरों के लिए एक ही प्रकार का उपयोग करना है

अगर आपको डालना चाहिए, तो विचार करें कि आप एक अतिप्रवाह पैदा कर सकते हैं और विचार कर सकते हैं कि आपके आवेदन के लिए महत्वपूर्ण है या नहीं।

बदलने के

 int x; /* ... */ for(x=0;x<sizeof(arr) / sizeof(int);x++) 

द्वारा

 for(size_t x=0;x<sizeof(arr) / sizeof(int);x++) 

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

ऐसे मामलों में, यह पता लगाने की कोशिश करें कि क्या हस्ताक्षरित संख्या का कोई भी मान हो सकता है जो ओवरफ़्लो का कारण बन सकता है। यदि नहीं, तो आप चेतावनी को अनदेखा कर सकते हैं। अन्यथा अहस्ताक्षरित प्रकार के लिए एक कलाकार (यदि यह समान आकार या हस्ताक्षरित घटक से बड़ा है) काफी अच्छा है।

मामले की जड़ है कि हस्ताक्षरित और अहस्ताक्षरित मूल्यों की तुलना कुछ अजीब मामलों को स्वीकार करते हैं। उदाहरण के लिए, उदाहरण के लिए, अहस्ताक्षरित सरणी लंबाई में जो कुछ होता है, वह अधिकतम से अधिक होता है जिसे हस्ताक्षरित इंट द्वारा दर्शाया जा सकता है। हस्ताक्षरित काउंटर ओवरफ़्लो (शेष "आकार" से कम है), और आप उस मेमोरी को संबोधित करना शुरू करते हैं जिसका आप अर्थ नहीं करते …

संकलक यह सुनिश्चित करने के लिए एक चेतावनी उत्पन्न करता है कि आप उनके बारे में सोच रहे हैं उपयोग -Werror त्रुटि को चेतावनी को बढ़ावा देता है और संकलन बंद कर देता है।

या तो अपने प्रकार के हस्ताक्षर को चुनने के लिए कठोर हो, या जब आप यह सुनिश्चित कर लेंगे कि यह लागू नहीं होता है, या छुटकारा पाने के लिए परेशानी दूर है या इसे दूर करने के लिए -Werror और उसे सभी चेतावनियों को ठीक करने या स्पष्टीकरण के साथ संबोधित करने की नीति बना दें .. ।

एक विकल्प अतिरिक्त ध्वज होगा "-विनो-साइन-तुलना" 🙂

इस विशेष मामले में एक चेतावनी को चुनौतीपूर्ण रूप से अक्षम करने के लिए एक वैकल्पिक हल होगा। जीसीसी की प्रगति निदान पर ध्यान नहीं दिया गया है "-कुछ"

 // Disable a warning for a block of code: #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmissing-prototypes" // ... Some code where the specified warning should be suppressed ... #pragma GCC diagnostic pop 

जीसीसी के हाल के संस्करण (मुझे वास्तव में यकीन नहीं है कि कब से, लेकिन 4.8.x को इसका समर्थन करना चाहिए) संबंधित -समय विकल्प दिखाएं यह महत्वपूर्ण है क्योंकि अधिकांश चेतावनी विकल्प स्पष्ट रूप से सेट नहीं किए जाते हैं, लेकिन विकल्पों के साथ- एक त्रुटि संदेश ऐसा दिखेगा:

 readers.c: In function 'buffered_fullread': readers.c:864:11: error: comparison between signed and unsigned integer expressions [-Werror=sign-compare] if(got < sizeof(readbuf)) /* That naturally catches got == 0, too. */ 

[- आतंक = साइन-तुलना] हिस्सा आपको बताता है कि आप चेतावनी को दबाने के लिए "Wsomething" के लिए "Wsign-compare" का उपयोग कर सकते हैं।

और निश्चित रूप से, आपको यह करना चाहिए, जहां यह उपयुक्त है (यह पठनीयता में काफी मदद नहीं करता है), जैसे जब कंपाइलर के बारे में चेतावनी देते हैं कि वास्तव में ऐसा व्यवहार होता है (या, यदि आप कोड बेस में बड़ा परिवर्तन नहीं शुरू कर सकते हैं)।

 test.c:11: error: comparison between signed and unsigned 

आप एक अहस्ताक्षरित int के रूप में एक्स को घोषित कर सकते हैं, क्योंकि size_t अहस्ताक्षरित है

संपादित करें:

यदि आप डालना नहीं चाहते हैं, और इसे अहस्ताक्षरित के रूप में घोषित नहीं करना चाहते हैं, तो मुझे नहीं लगता कि ऐसा करने के लिए बहुत कुछ है।

हो सकता है कि बिटवर्ड ऑपरेशन इसे हल करने का एक तरीका है, साइन बिट को निकालते हैं। मुझे कहना है, आईएमओ इसकी बहुत संदिग्ध है हालांकि।

हम अपने दृश्य स्टूडियो में इस चेतावनी को संकलित करते हैं, क्योंकि यह बहुत कुछ होता है और लगभग कभी भी महत्वपूर्ण कुछ भी नहीं होता है बेशक, सभी कोडन मानकों की अनुमति नहीं है कि

आप प्रकार सहमत कर सकते हैं (उदाहरण के लिए, चतुर्भुज आकार या अहस्ताक्षरित int के बजाय घोषित), या आप कास्ट कर सकते हैं, या आप अपना संकलन लाइन बदल सकते हैं। यह इसके बारे में।

कास्टिंग बहिष्कार दुविधा के बावजूद, मैं अभी भी तर्क के लिए लूप से अलग करने का सुझाव देता हूं।

 int range = (int)(sizeof(arr) / sizeof(int)); int x; for(x = 0; x < range; x++) { printf("%d\n", arr[x]); } 

यद्यपि यह कास्टिंग का उपयोग करता है जिसे आपने कहा था कि पदावनत किया गया था, यह उस स्थान को साफ़ करता है जहां कास्टिंग किया जा रहा है। सामान्य तौर पर, मैं आपके लिए लूप घोषणाओं में बहुत सारे तर्कों को कुचलने के लिए सलाह देता हूं। विशेष रूप से आपके मामले में जहां आप size_t डिवीजन का उपयोग कर रहे हैं, जो (क्योंकि यह पूर्णांक प्रभाग है) उत्तर को कम करने की संभावना हो सकती है। लूप घोषणा के लिए साफ होना चाहिए, और कोई त्रुटियां उत्पन्न नहीं करनी चाहिए। आपका कास्टिंग एक अलग स्थान पर हो रहा है जिसका अर्थ है कि यदि आप रेंज बना रहे हैं, तो आप को घोषणा करने के बारे में अब तक गड़बड़ करने की आवश्यकता नहीं है।