编译器:
Windows 8.1下的Nuwen发行版64位MinGW G 4.9.1.
码:
#ifdef INCLUDE_IOSTREAM # include <iostream> #endif #include <stdio.h> // ::snprintf #include <stdlib.h> // EXIT_SUCCESS,EXIT_FAILURE #include <stdexcept> // std::exception #ifdef snprintf # error snprintf defined as macro #endif #ifdef _MSC_VER auto const snprintf = _snprintf; #endif void test( double const value,int const precision) { char buffer[34]; snprintf( buffer,sizeof( buffer ),"%.*a",precision,value ); printf( "Hex of %.3f with %2d digits: %s\n",value,buffer ); } auto main() -> int { using namespace std; try { for( int precision = 6; precision <= 8; ++precision ) { test( 5.0,precision ); } test( 0.0,14 ); return EXIT_SUCCESS; } catch( exception const& x ) { fprintf( stderr,"!%s\n",x.what() ); } return EXIT_FAILURE; }
Visual C可以正常工作(但Visual C似乎缺乏相反的转换):
H:\dev\test\so\0187>cl /nologo- /? 2>&1 | find /i "ler ver" Microsoft (R) C/C++ Optimizing Compiler Version 18.00.30723 for x86 H:\dev\test\so\0187>cl barx.cpp -D INCLUDE_IOSTREAM /Feb barx.cpp H:\dev\test\so\0187>b Hex 5.000 with 6 digits: 0x1.400000p+2 Hex 5.000 with 7 digits: 0x1.4000000p+2 Hex 5.000 with 8 digits: 0x1.40000000p+2 Hex 0.000 with 14 digits: 0x0.00000000000000p+0 H:\dev\test\so\0187>_
当< iostream>不包括:
H:\dev\test\so\0187>g++ --version | find "++" g++ (GCC) 4.9.1 H:\dev\test\so\0187>g++ -std=c++11 barx.cpp H:\dev\test\so\0187>a Hex of 5.000 with 6 digits: 0x1.400000p+2 Hex of 5.000 with 7 digits: 0x1.4000000p+2 Hex of 5.000 with 8 digits: 0x1.40000000p+2 Hex of 0.000 with 14 digits: 0x0.00000000000000p+0 H:\dev\test\so\0187>_
当< iostream>时,异常结果挂起已经包括了:
H:\dev\test\so\0187>g++ -std=c++11 -D INCLUDE_IOSTREAM barx.cpp H:\dev\test\so\0187>a Hex of 5.000 with 6 digits: 0xa.000000p-1 Hex of 5.000 with 7 digits: 0xa.0000000p-1 Hex of 5.000 with 8 digits: 0x0.00000000p-33 ← Weird. ^C ← Hang,Ctrl+C H:\dev\test\so\0187>_
我要求修复或解决方法.