c - 如何检测 printf 是否支持 %a?

标签 c printf mingw

我需要无损地表示字符串中的 double float ,因此我使用

sprintf(buf, "%la", x);

这在我的系统上运行良好,但是当在 Windows 下的 MinGW 上构建时,会发出警告:

unknown conversion type character 'a' in format

我为这种情况编写了一个解决方法,但无法检测何时应该使用该解决方法 - 我尝试过#if __STDC_VERSION__ >= 199901L,但似乎 Gcc/MinGW 定义了即使它不支持%a。还有其他宏我可以检查吗?

最佳答案

这并没有回答“如何检测 printf 是否支持 %a?”的问题。在一般情况下,但您可以修改编译器安装,以便支持 %a

首先,使用mingw-w64 。这是 MinGW 的最新分支。 MinGW 的原始版本维护得不好,并且没有修复您遇到的错误(宁愿责怪微软什么的)。

在 Windows 10 中使用 mingw-w64 4.9.2,以下代码适用于我:

#include <stdio.h>

int main()
{
    double x = 3.14;
    printf("%a\n", x);
}

生成 0x1.91eb85p+1 这是正确的。这仍然遵循 Microsoft 运行时。


您的问题提到了 %la,但是 %a%la 都是相同的,可以用来打印 floatdouble 参数。

如果您想打印long double,那么 Microsoft 运行时不支持; gcc 和 MS 使用不同大小的 long double。您必须使用 mingw-w64 自己的 printf 实现:

#define __USE_MINGW_ANSI_STDIO 1
#include <stdio.h>

int main()
{
    long double x = 3.14;
    printf("%La\n", x);
}

输出0xc.8f5c28f5c28f8p-2。这实际上与 0x1.91eb85p+1 相同,但精度更高,并且二进制小数点的位置不同,它也是正确的。

关于c - 如何检测 printf 是否支持 %a?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39112759/

相关文章:

c - 如何以 C 程序修复我的 "Guess the Movie"游戏中的逻辑错误

c - 使用外部文件中的信息,如何使用 fread 正确填充数组?

c# - 等价于 C# 中的 sprintf?

c - PRINTF 防止进入低功耗模式

c - ld.exe 找不到 -lfl

c - 用户单击顶部栏时应用收到的消息

c - 变量可以在设置之前使用

C打印 double 类型指针值不起作用

c++ - 使用 c++11 编译时,Mingw g++ 无法识别 off_t

c - 在 C 中获取控制台缓冲区内容