5

Piszę program, który konwertuje kod bajtowy CIL na kod źródłowy C dla zużycia maszyny. Obawiałem się niedokładności stałych zmiennoprzecinkowych z powodu konwersji na i z dziesiętnej. Po przeprowadzeniu badań odkryłem, że C (ale nie C++) powinien przyjmować notację szesnastkową dla stałych zmiennoprzecinkowych.VC odrzuca szesnastkową stałą zmiennoprzecinkową

Postanowiłem spróbować, ale MS VC9 daje mi błędy bez względu na to, co próbuję. Oto, co usiłuję:

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

Spodziewałem się tego, aby wydrukować 2, od 1x2^1, ale zamiast tego daje mi ten błąd kompilatora:

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

zdaję sobie sprawę C++ nie obsługuje tę składnię (przynajmniej tak, czytałem,), ale zauważ, że jest skompilowana z /TC, więc powinna być prosta C, i użyłem również nazwy pliku *.c dla dobrego pomiaru.

Czy robię coś złego tutaj, czy VC9 nie jest zgodny ze standardami?

Odpowiedz

8

Nie ma nic złego w tym kodzie. Zmienne szesnastkowe zmiennoprzecinkowe zostały dodane do C w standardzie C99, ale MSVC obsługuje tylko starszy standard C90 (z niektórymi rozszerzeniami, takimi jak // komentarze jednowierszowe i long long).

+0

Dziękujemy za potwierdzenie; Obawiałem się, że to coś takiego. Sądzę, że będę musiał dodać przełącznik, aby wygenerować dziesiętną notację naukową dla kompilatorów sprzed C99. – Kevin

1

C++ Standard 17 dodał pełną obsługę literałów C99 w systemie szesnastkowym. Visual C++ będzie je dostępne w wersji Visual Studio 2017 15.6.

Powiązane problemy