5

Sto scrivendo un programma che converte il bytecode CIL in codice sorgente C per il consumo della macchina. Ero preoccupato per l'inaccuratezza delle costanti floating point dovute alla conversione da e verso i decimali. Dopo aver fatto qualche ricerca, ho scoperto che C (ma non C++) dovrebbe essere in grado di accettare una notazione esadecimale per le costanti in virgola mobile.VC che rifiuta la costante esadecimale in virgola mobile

Ho deciso di provarlo, ma MS VC9 mi dà errori, non importa quello che provo. Qui è quello che sto cercando:

// Switches: /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /FD /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /nologo /c /ZI /TC 

#include <tchar.h> 
#include <stdio.h> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    double d = 0x1.0p+1; // error C2059 
    //double d = 0x1p+1; // doesn't work either 
    //double d = 0x1p1;  // doesn't work either 
    //double d = 0x1.0p1; // doesn't work either 

    printf("%f\n", d); 

    return 0; 
} 

Mi aspettavo questo per stampare 2, da 1x2^1, ma invece mi dà questo errore di compilazione:

error C2059: syntax error : 'bad suffix on number' 

mi rendo conto C++ non lo fa Supporta questa sintassi (o così ho letto,) ma nota che questo è compilato con /TC quindi dovrebbe essere dritto C, e ho usato un nome di file *.c anche per buona misura.

Sto facendo qualcosa di sbagliato qui, o VC9 non è conforme agli standard?

risposta

8

Non c'è niente di sbagliato nel codice. Le costanti esadecimali a virgola mobile sono state aggiunte a C nello standard C99, ma MSVC supporta solo lo standard C90 precedente (con alcune estensioni, come i commenti a riga singola // e il tipo long long).

+0

Grazie per la conferma; Avevo paura che fosse qualcosa del genere. Credo che dovrò aggiungere un interruttore per la notazione scientifica decimale in uscita per i compilatori pre-C99. – Kevin

1

C++ 17 ha aggiunto il supporto completo di valori letterali in virgola mobile esadecimali C99. Visual C++ sarà disponibile nella versione 15.6 di Visual Studio 2017.