игнорируя возвращаемое значение ' 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??
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