2009-12-10 15 views
6

C'è una buona ragione per cui questo programma viene compilato in GCC anche con i flag -ansi e -pedantic?Perché GCC consente l'uso di round() in C++ anche con i flag ansi e pedantic?

#include <cmath> 

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

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

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

vedo due problemi:

  1. round() non dovrebbe essere a disposizione di C++ in modalità ISO-conforme (in quanto proviene da C99)
  2. Anche se round() erano disponibili, in questo caso, solo dovrebbe essere così dal namespace std

Mi sbaglio?

risposta

2

This is a bug. È stato intorno per un tempo sorprendentemente lungo. Apparentemente, non c'è stato abbastanza di un desiderio collettivo di risolverlo. Con una nuova versione di C++ appena dietro l'angolo che adotterà le funzioni C99 da math.h, sembra improbabile che venga mai riparata.

0

Potrei trovarmi fuori base qui, ma il flag gcc -ansi non si applica ai costrutti del codice (ovvero, disabilitare GCC lingua estensioni) anziché passare tutte le librerie in modalità ANSI rigorosa?

+0

la pagina man di gcc indica che alcune funzioni non saranno definite quando viene impostato il flag ansi, ma non solo le funzioni ansi verranno definite – josefx

+0

@josefx: vedere i miei commenti a D. Shawley. Dopo aver studiato di più, ho appreso che le estensioni della libreria non possono "alterare il comportamento di programmi ben formati". Quindi mi sembra che aggiungere un'estensione 'round()' alla libreria sia illegale, il che rende il comportamento del moot della bandiera '-ansi'. –

-1

Credo che gli standard specificano quali simboli devono essere definiti e in quale intestazione sono definiti. Non credo che gli Standard affermino che nessun altro simbolo possa essere definito. Più precisamente, std::round() non sarà definito da un simbolo libero chiamato round() può essere definito.

+0

Ok, potrebbe essere vero ma lo scopo di '-ansi', secondo il manuale di GCC, è quello di disabilitare * tutte le estensioni non standard. Tutte queste funzioni di libreria aggiuntive sarebbero estensioni dello standard (se tali estensioni sono consentite dallo standard è tangenziale a questa domanda). –

+0

Dovrei modificare il mio commento precedente: '-ansi' disabilita * estensioni * in conflitto *, mentre' -pedantic' dovrebbe disabilitare tutte le estensioni. –

+2

In realtà, ho esaminato entrambi gli standard C e C++ e sebbene consentano funzioni di libreria aggiuntive, tali estensioni non possono "alterare il comportamento di qualsiasi programma ben formato". Ciò implica che essi non possono riservare alcun identificatore aggiuntivo (ad esempio un programma ben formato che definisce la propria funzione round() interromperebbe la libreria estendendo lo standard con la propria funzione circolare). Qualsiasi funzione di libreria aggiuntiva deve avere nomi * già * riservati, come ad esempio '_Round()'. –

Problemi correlati