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?
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