Исправлено для странного поведения формата "% a" с g++ 4.9.1?

Компилятор: 64-битный MinGW g++ 4.9.1 из дистрибутива Nuwen под Windows 8.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, precision, 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 С++ (но Visual С++, похоже, не имеет обратного преобразования):

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

Также отлично работает с g++, когда <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>_

Необычный результат w/hang, когда включен <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>_

I & rsquo; m запрашивает исправление или обходное решение.

Ответ 1

Реализация Microsoft имеет несколько ошибок printf, и они влияют на MinGW по умолчанию (# 377, # 407, и др.).

Во всех случаях рекомендация отображается, чтобы определить __USE_MINGW_ANSI_STDIO как 1 в препроцессоре, чтобы использовать собственную совместимую с ANSI реализацию MinGW вместо этого.

Предположительно, Visual Studio имеет собственные внутренние обходные пути для недостатков базового системного кода.