作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要无损地表示字符串中的 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
都是相同的,可以用来打印 float
或 double
参数。
如果您想打印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/
我是一名优秀的程序员,十分优秀!