2013-06-24 16 views
5

Aşağıdaki programı derlediğim zaman: g++ -O2 -s -static 2.cpp bana ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result] numaralı uyarıyı verdi.
Ancak, -02 numaralı kopyasını kaldırma ifadesinden kaldırdığımda uyarı görüntülenmiyor., warn_unused_result [-Wunused-result] özniteliğiyle bildirilen “int scanf (const char *, ...)” öğesinin dönüş değerini göz ardı ediyor mu?

Benim 2.cpp programı:

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


bu uyarı anlamı nedir ve -O2 anlamı nedir ??

cevap

7

Bu, scanf'in dönüş değerini kontrol etmediğiniz anlamına gelir.

Çok iyi geri dönüş 1 (yalnızca ayarlanmış) veya 0 (ne a ne de ne ayarlanmış) olabilir.

Optimizasyon yapılmadan derlendiğinde gösterilmemesinin nedeni, optimizasyon etkin olmadıkça bunun görmesi için gerekli analitiğin yapılmamasıdır. -O2 optimizasyonları sağlar - http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html.

Basitçe iki sayı almazsa bir iddia edilebilir şekilde uyarıyı kaldırmak ve program davranacağınızı yapacak dönüş değerini kontrol:

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

Öyleyse, bu uyarıyı nasıl sileceğim, çünkü yazdığım tüm C programlarına kadar scanf'in dönüş değerini kontrol etmedim !!! Ayrıca bu optimizasyon parametresi nedir? –

+0

@perh Bu iyi bir sebep mi? – Antonio

+0

Eh, denetleme değil, değişkenlerden biri sscanf tarafından ayarlanmamışsa (başlatılmamış değerler kullanılarak) programın yanlış değerini döndüreceği anlamına gelir. Bu sadece bir uyarı, bir hata değil. Derleyici tarafından gerçekleştirilen bir analitik eksikliğinden dolayı (en azından) -O kullanılmadığı zaman gösterilmiyorsa olduğu gibi. – perh

0

ben eşleşen bir eğer açıklama yaparak uyarı hallettim argümanların sayısı:

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