2012-01-30 10 views
13

Quando si utilizza la variante double della funzione std::abs() senza std con g ++ 4.6.1, non viene visualizzato alcun avviso o errore.Evitare problemi del compilatore con abs()

#include <algorithm> 
#include <cmath> 

double foobar(double a) 
{ 
    return abs(a); 
} 

Questa versione di g ++ sembra essere tirando in double variante abs() nel namespace globale attraverso una delle comprende da algorithm. Sembra che ora sia consentito dallo standard (vedere questo question), ma non richiesto.

Se compilo il codice sopra utilizzando un compilatore che non tirare il double variante abs() nel namespace globale (ad esempio g ++ 4.2), quindi viene segnalato il seguente errore:

warning: passing 'double' for argument 1 to 'int abs(int)' 

Come posso forza g ++ 4.6.1, e altri compilatori che estraggono funzioni nello spazio dei nomi globale, per dare un avvertimento in modo da poter evitare errori quando usato con altri compilatori?

+3

Cosa c'è di sbagliato con l'utilizzo di 'std :: abs' se questa è la funzione che ti serve? –

+3

@JonathanLeffler Niente, ma può essere facile perderselo per errore. Non voglio che lo slip vada inosservato e causa problemi di compilazione con altri compilatori. –

risposta

8

La funzione che si sta utilizzando è in realtà la versione intera di abs, e GCC fa una conversione implicita a intero.

Questo può essere verificato da un semplice programma di test:

#include <iostream> 
#include <cmath> 

int main() 
{ 
    double a = -5.4321; 
    double b = std::abs(a); 
    double c = abs(a); 

    std::cout << "a = " << a << ", b = " << b << ", c = " << c << '\n'; 
} 

uscita è:

 
a = -5.4321, b = 5.4321, c = 5 

Per ottenere un avvertimento su questo, utilizzare il flag -Wconversion a g ++. In realtà, la documentazione GCC per tale opzione menziona esplicitamente chiamando abs quando l'argomento è un double. Tutte le opzioni di avviso possono essere trovate here.

+0

Il codice di esempio non corrisponde all'output. –

+0

@SamDeHaan Spiacente, risultato aggiornato ma ho dimenticato di aggiornare il codice. :) –

+0

E 'lo standard che ha cambiato o un cambiamento di g ++' s applicazione che causa la conversione implicita con 4.6.1 e non 4.2? Sono entrambi validi? –

Problemi correlati