2013-06-24 3 views
5

जब मैंने निम्न प्रोग्राम संकलित किया: g++ -O2 -s -static 2.cpp यह मुझे चेतावनी ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result] दिया।
लेकिन जब मैं -02 को संकलित कथन से हटाता हूं तो कोई चेतावनी नहीं दिखायी जाती है।'int scanf (const char *, ...)' के वापसी मूल्य को अनदेखा करते हुए, विशेषता चेतावनी_unused_result [-उन्यूज्ड-परिणाम] के साथ घोषित किया गया?

मेरे 2.cpp कार्यक्रम:

#include<stdio.h> 
int main() 
{ 
    int a,b; 
    scanf("%d%d",&a,&b); 
    printf("%d\n",a+b); 
    return 0; 
} 


इस चेतावनी का अर्थ क्या है और -O2 का अर्थ क्या है ??

उत्तर

7

इसका मतलब है कि आप स्कैनफ़ के वापसी मूल्य की जांच नहीं करते हैं।

यह बहुत अच्छी तरह से वापस लौटा सकता है (केवल एक सेट है) या 0 (न तो एक और न ही बी सेट है)।

ऑप्टिमाइज़ेशन के बिना संकलित किए जाने पर यह दिखाया नहीं गया है कि यह देखने के लिए आवश्यक एनालिटिक्स तब तक नहीं किया जाता जब तक ऑप्टिमाइज़ेशन सक्षम नहीं होता है। -ओ 2 अनुकूलन सक्षम करता है - http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

सीधे शब्दों में वापसी मान की जाँच चेतावनी को हटाने और एक predicable तरह से प्रोग्राम व्यवहार कर देगा अगर यह दो नंबर प्राप्त नहीं होता है:

if(scanf("%d%d", &a, &b) != 2) 
{ 
    // do something, like.. 
    fprintf(stderr, "Expected at least two numbers as input\n"); 
    exit(1); 
} 
+0

तो मैं इस चेतावनी को कैसे हटा सकता हूं क्योंकि आज तक मैंने जिन सभी सी कार्यक्रमों को लिखा है, मैंने कभी स्कैनफ के वापसी मूल्य की जांच नहीं की !!! यह अनुकूलन पैरामीटर क्या आप कुछ प्रकाश फेंक सकते हैं? –

+0

@perh क्या यह एक अच्छा कारण है? – Antonio

+0

ठीक है, जांच नहीं है कि प्रोग्राम गलत मान वापस कर देगा यदि किसी भी चर को sscanf द्वारा सेट नहीं किया गया है (अनियमित मानों का उपयोग करके)। यह सिर्फ एक चेतावनी है, एक त्रुटि नहीं। क्योंकि यह संकलक द्वारा किए गए विश्लेषण की कमी के कारण (कम से कम) -O का उपयोग नहीं करते समय दिखाया नहीं जा रहा है - यह वही है। – perh

0

मैं एक अगर बयान से मेल खाता है बनाकर चेतावनी का ध्यान रखा तर्कों की संख्या:

#include <iostream> 
#include <cstdio> 
using namespace std; 

int main() { 
    int i; 
    long l; 
    long long ll; 
    char ch; 
    float f; 
    double d; 

    //6 arguments expected 
    if(scanf("%d %ld %lld %c %f %lf", &i, &l, &ll, &ch, &f, &d) == 6) 
    { 
     printf("%d\n", i); 
     printf("%ld\n", l); 
     printf("%lld\n", ll); 
     printf("%c\n", ch); 
     printf("%f\n", f); 
     printf("%lf\n", d); 
    } 
    return 0; 
} 
संबंधित मुद्दे