игнорируя возвращаемое значение ' int scanf(const char*,...)', объявленное с атрибутом warn unused result [-Wunused-result]?



Когда я скомпилировал следующую программу, как:
g++ -O2 -s -static 2.cpp он дал мне предупреждение ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result].

Но когда я удаляю -02 из оператора copiling, предупреждение не отображается.



Моя 2.cpp программа:



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




В чем смысл этого предупреждения и в чем смысл -O2??

542   2  
g++

2 ответов:

Это означает, что вы не проверяете возвращаемое значение scanf.

Он вполне может вернуть 1 (только a установлен) или 0 (ни a, ни b не установлены).

Причина, по которой он не отображается при компиляции без оптимизации, заключается в том, что аналитика, необходимая для этого, не выполняется, если оптимизация не включена. - O2 включает оптимизацию - http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html .

Простая проверка возвращаемого значения удалит предупреждение и сделает программа ведет себя предсказуемым образом, если она не получает два числа:

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

Я позаботился о предупреждении, сделав оператор if, который соответствует числу аргументов:

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

Comments

    Ничего не найдено.