c – 用g 4.9.1修复奇怪的“%a”格式行为?

c – 用g 4.9.1修复奇怪的“%a”格式行为?,第1张

概述编译器: 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#includ 编译器: 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;#endifvoID 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 x86H:\dev\test\so\0187>cl barx.cpp -D INCLUDE_IOSTREAM /Febbarx.cppH:\dev\test\so\0187>bHex 5.000 with  6 digits: 0x1.400000p+2Hex 5.000 with  7 digits: 0x1.4000000p+2Hex 5.000 with  8 digits: 0x1.40000000p+2Hex 0.000 with 14 digits: 0x0.00000000000000p+0H:\dev\test\so\0187>_

当< iostream>不包括:

H:\dev\test\so\0187>g++ --version | find "++"g++ (GCC) 4.9.1H:\dev\test\so\0187>g++ -std=c++11 barx.cppH:\dev\test\so\0187>aHex of 5.000 with  6 digits: 0x1.400000p+2Hex of 5.000 with  7 digits: 0x1.4000000p+2Hex of 5.000 with  8 digits: 0x1.40000000p+2Hex of 0.000 with 14 digits: 0x0.00000000000000p+0H:\dev\test\so\0187>_

当< iostream>时,异常结果挂起已经包括了:

H:\dev\test\so\0187>g++ -std=c++11 -D INCLUDE_IOSTREAM barx.cppH:\dev\test\so\0187>aHex of 5.000 with  6 digits: 0xa.000000p-1Hex of 5.000 with  7 digits: 0xa.0000000p-1Hex of 5.000 with  8 digits: 0x0.00000000p-33           ← Weird.^C                                                      ← Hang,Ctrl+CH:\dev\test\so\0187>_

我要求修复或解决方法.

解决方法 Microsoft的实现有许多printf BUG,这些缺陷会影响MinGW( #377,#407等).

在所有情况下,建议appears to be在预处理器中将__USE_MINGW_ANSI_STdio定义为1,以替代使用MinGW自己的ANSI兼容实现.

大概Visual Studio有自己的内部解决方案,用于底层系统代码的缺陷.

总结

以上是内存溢出为你收集整理的c – 用g 4.9.1修复奇怪的“%a”格式行为?全部内容,希望文章能够帮你解决c – 用g 4.9.1修复奇怪的“%a”格式行为?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1234383.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存