2009-11-13 15 views
5

मैंने हाल ही में नेटबीन्स सी/सी ++ समर्थन के साथ चीजें कैसे हैं, यह जांचने के लिए मैंने अपने लैपटॉप पर एक मिनीजीडब्ल्यू + एमएसवाईएस वातावरण स्थापित किया है। सब कुछ ठीक काम करता प्रतीत होता है, हालांकि, मेरे परीक्षण के दौरान मैंने जीसीसी और माइक्रोसॉफ्ट के cl.exe कंपाइलर के बीच एक अंतर देखा है।जीसीसी - एक चेतावनी जारी नहीं की जानी चाहिए?

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 

int main(void) { 
    int i_max = INT_MAX; 
    char c_max = CHAR_MAX, c; 

    c = i_max; 
    printf("i_max: %d, c_max: %d, c: %d\n", i_max, c_max, c); 
    return EXIT_SUCCESS; 
} 

उत्पादन होता है:

i_max: 2147483647, c_max: 127, c: -1 

आप उपरोक्त कोड में देख सकते हैं, मैं एक चार के लिए एक पूर्णांक आवंटित

यहां एक नमूना कार्यक्रम है। क्या यह एक चेतावनी उत्पन्न नहीं करेगा कि संभावित डेटा हानि हो सकती है? माइक्रोसॉफ्ट के कंपाइलर (जिसे मैंने बहुत सख्त होने के लिए कॉन्फ़िगर किया है) चेतावनी जारी करता है जबकि जीसीसी नहीं करता है।

-g -Werror -ansi -pedantic -Wall -Wextra 

मैं संकलन समय चेकों भी सख्त बनाने के लिए कुछ जीसीसी विकल्प याद आ रही हूँ:

यहाँ जीसीसी विकल्प का उपयोग कर रहे हैं?

उत्तर

9

आप के लिए

-Wconversion 

देख रहे हैं आप विशिष्ट कारणों क्यों कुछ चेतावनियों -Wall या -Wextra में शामिल नहीं हैं के लिए एक जीसीसी डेवलपर पूछना होगा। एक प्रकार रूपांतरण के लिए मजबूर कर प्रोटोटाइप के बारे में पुराने चेतावनी अब -Wtraditional-conversion रूप में उपलब्ध है -

-Wall -Wextra -Wmissing-prototypes -Wmissing-declarations -Wshadow 
-Wpointer-arith -Wcast-align -Wwrite-strings -Wredundant-decls -Wnested-externs 
-Winline -Wno-long-long -Wconversion -Wstrict-prototypes 

के रूप में अन्य के ने बताया है, -Wconversion के व्यवहार version 4.3 साथ बदल दिया है:

वैसे भी, इन चिह्नों का उपयोग मैं कर रहे हैं।

+1

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html यह लिंक आपको दिखाता है कि दीवार और वेक्स्ट्रा में _is_ क्या शामिल है। क्यों wconversion यह एक पूर्ण रहस्य/बग नहीं है। – Pod

+1

मेरी राय यह है कि वे चेतावनियां कुछ पकड़ने की तुलना में पीछे की ओर दर्द होती हैं, और जीसीसी नीति निर्णयों की मेरी भावना यह है कि वे ऐसा सोचते हैं। यह एक अच्छा विचार होगा कि एक -W विकल्प जिसका अर्थ है "सबकुछ जांचें, इससे कोई फर्क नहीं पड़ता कि कितना परेशान है"। –

+1

मेरे लिए काम नहीं करता है। foo.c में उपरोक्त कोड के साथ "gcc -g -Werror -ansi -pedantic -Wall -Wextra -Wconversion foo.c" का उपयोग करके जीसीसी 4.1.2 – Glen

2

-Wall doesn't quite mean -Wall, -वेक्स्ट्रा पहले से ही थोड़ा अधिक पैडेंटिक होने के लिए आग में है।

जैसा कि क्रिस्टोफ ने कहा था, आप -conconversion की तलाश में हैं। वास्तव में क्या करना है -वॉल और -वेक्स्ट्रा वास्तव में चालू करने के लिए अच्छा है, और केवल अपनी बनावट फ़ाइल में इच्छित -W फ़्लैग निर्दिष्ट करें, खासकर यदि त्रुटियों को त्रुटियों के रूप में देखते हैं।

+0

यदि आपको हस्ताक्षर तुलना के बारे में चेतावनियां पसंद नहीं हैं, तो उन्हें अक्षम करें; भी, सख्त चेतावनियां विरासत कोडबेस के लिए एक समस्या हो सकती हैं, लेकिन यदि आप खरोंच से शुरू करते हैं, तो वास्तव में आपके कोड को चेतावनी मुक्त करना मुश्किल नहीं है - मुझे लगता है कि कुछ लोग केवल आलसी हैं;) – Christoph

1

सी में, एक char को int को असाइन करना कानूनी है।

चूंकि यह कानूनी है (लेकिन संभवतः डोडी) अलग-अलग कंपाइलर विक्रेता अलग-अलग चीजें करते हैं जब उन्हें इस कोड का सामना करना पड़ता है।

मुझे लगता है कि एमएस सिर्फ अतिरिक्त पैडेंटिक है जबकि जीसीसी लोगों ने फैसला किया है कि यह चेतावनी के लायक भी नहीं है।

0

मैं इसे "सामान्य गणित रूपांतरण" (6.3.1.8) या "पूर्णांक पदोन्नति नियम" के अंतर्गत आती है लगता है (5.1.2.3 (?)), लेकिन मैं विशिष्ट पाठ है कि व्यवहार आप 'का कहना है नहीं मिल सकता है फिर से देखने की उम्मीद है।

2

आपके प्रश्न में थोड़ी सी बारी है जो मुझे जिस तरह से शब्दों के बारे में स्पष्ट रूप से स्पष्ट नहीं है।

यदि आपको लगता है कि जीसीसी (विशेष रूप से जीसीसी) को यहां एक चेतावनी जारी करनी चाहिए, तो कुछ कंपाइलर विकल्प संभवतः मदद कर सकते हैं (अन्य उत्तरों देखें)।

यदि आपको लगता है किसी भी संकलक एक चेतावनी यहाँ जारी करना चाहिए (और मैं अपने प्रश्न में है कि भावना को पढ़ने के लिए लग रहे हैं), तो ... अच्छी तरह से, "चेतावनी" यह किसी भी प्रकार अनिवार्य या यहाँ तक कि जिस वास्तविक एकीकृत कर रहे हैं । यहां कोई "चाहिए" नहीं है। एक बड़े प्रकार के एक पूर्ण प्रकार के बिना एक बड़े प्रकार के पूर्णांक मान को असाइन करना, सी पर ओवरफ्लो रूपांतरण में है, कार्यान्वयन-परिभाषित व्यवहार (यह यूबी भी नहीं है :))

2

मुझे चेतावनी/त्रुटि नहीं मिली -Wconversion के साथ या तो। हालांकि, अगर आप splint की तरह कुछ के साथ एक पास देने आपको तीन चेतावनियां मिलती है:

file.c: (in function main) 
file.c:9:5: Assignment of int to char: c = i_max 
    To make char and int types equivalent, use +charint. 
file.c:10:52: Format argument 2 to printf (%d) expects int gets char: c_max 
    file.c:10:32: Corresponding format code 
file.c:10:59: Format argument 3 to printf (%d) expects int gets char: c 
    file.c:10:39: Corresponding format code 

Finished checking --- 3 code warnings 

आप सभी त्रुटियों को पकड़ने आप एक से अधिक उपकरण का उपयोग करना चाहिए के बारे में गंभीर हैं।

+0

ध्यान रखें कि, एक भिन्नता के लिए printf() जैसे फ़ंक्शन, एक char को int के रूप में पास किया जाएगा, और% d संख्यात्मक मान प्राप्त करने के लिए सही प्रारूप निर्दिष्ट है। एक% सी मूल्य को एक चरित्र के रूप में मुद्रित करेगा, अंतर यह है कि "65" और "ए" के बीच अंतर। –

+0

दाएं (हालांकि, एक कलाकार इसे स्पष्ट कर देगा और इस प्रकार चेतावनी को हटा देगा)। मेरा मुद्दा इस तथ्य की ओर अधिक था कि त्रुटि-/बग-फ्री कोड पर बंद करने का प्रयास करते समय कई बिंदु दृश्य महत्वपूर्ण हैं। – ezpz

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