2013-06-24 7 views
5

Kiedy skompilowałem następujący program: g++ -O2 -s -static 2.cpp dało mi ostrzeżenie ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result].
Ale po usunięciu -02 z instrukcji copiling nie jest wyświetlane ostrzeżenie.ignorowanie zwracanej wartości 'int scanf (const char *, ...)', zadeklarowanej z atrybutem warn_unused_result [-Wunused-result]?

Moja 2.cpp Program:

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


Jakie jest znaczenie tego ostrzeżenia oraz jakie jest znaczenie -O2 ??

Odpowiedz

7

Oznacza to, że nie sprawdza się wartości zwracanej przez scanf.

Może bardzo dobrze powrócić 1 (tylko a jest ustawione) lub 0 (ani a, ani b nie jest ustawione).

Powodem, dla którego nie jest wyświetlana podczas kompilacji bez optymalizacji, jest to, że analityka potrzebna do zobaczenia nie zostanie wykonana, dopóki nie zostanie włączona optymalizacja. -O2 włącza optymalizacje - http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html.

prostu sprawdzanie wartości zwracanej usunie ostrzeżenia i sprawiają, że zachowuje się program w przewidywalny sposób, jeśli nie otrzyma dwóch liczb:

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

tak jak usunąć to ostrzeżenie, ponieważ do tej pory wszystkie programy napisane przez C nigdy nie sprawdzałem wartości zwracanej przez scanf !!! Co to za parametr optymalizacji, możesz rzucić trochę światła? –

+0

@perh Czy to dobry powód? – Antonio

+0

Cóż, nie sprawdzanie oznacza, że ​​program zwróci błędną wartość, jeśli którakolwiek ze zmiennych nie jest ustawiona przez sscanf (używając niezainicjowanych wartości). To tylko ostrzeżenie, a nie błąd. Co do tego, że nie jest pokazywany, gdy nie używa (przynajmniej) -O z powodu braku analiz przeprowadzanych przez kompilator - tak to właśnie jest. – perh

0

Zająłem ostrzeżenia poprzez if pasujący liczba argumentów:

#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; 
}