5

当我编译以下程序时: g++ -O2 -s -static 2.cpp它给了我警告ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
但是当我-02从编译语句中删除时,没有显示警告。

我的2.cpp程序:

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


此警告的含义是什么? 的含义是什么-O2

4

2 回答 2

10

这意味着您不检查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);
}
于 2013-06-24T12:10:20.087 回答
0

我通过制作与参数数量匹配的 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;
}
于 2015-05-30T23:05:03.490 回答