Perché GCC consentire l'uso del giro () in C ++, anche con le bandiere ANSI e pedanti?

StackOverflow https://stackoverflow.com/questions/1882689

  •  19-09-2019
  •  | 
  •  

Domanda

C'è una buona ragione per cui questo programma viene compilato con GCC anche con le -ansi e -pedantic bandiere?

#include <cmath>

int main (int argc, char *argv [])
{
     double x = 0.5;

     return static_cast<int>(round(x));
}

Questa compila pulite (nessun avviso, anche) con g++ -ansi -pedantic -Wall test.cpp -o test.

vedo due problemi:

  1. round() non dovrebbe essere disponibile per C ++ in modalità ISO-conforme (in quanto proviene da C99)
  2. Anche se round() fosse disponibile in questo caso, dovrebbe essere solo in modo dallo spazio dei nomi std

Mi sbaglio?

È stato utile?

Soluzione

Questo è un bug . E 'stato intorno per un po' sorprendentemente lungo. A quanto pare, non c'è stato abbastanza di un desiderio collettivo per risolvere il problema. Con una nuova versione di C ++ proprio dietro l'angolo, che adotterà le funzioni C99 da math.h, sembra improbabile che possa mai essere risolto.

Altri suggerimenti

Potrei essere fuori base qui, ma non la bandiera -ansi non di gcc applica ai costrutti di codice (ad esempio, disabilitare GCC lingua estensioni) piuttosto che passare tutte le librerie in modalità compatibile ANSI rigorosa come bene?

Credo che le norme specificano quali simboli devono essere definiti e in cui colpo di testa sono definiti. Non credo che le norme statali che non altri simboli possono essere definiti. Più precisamente, std::round() non sarà definita da un simbolo gratuito chiamato round() può essere definito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top