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

时间:2016-08-24 00:43:48

标签: c printf mingw

我需要无损地表示字符串中的双精度浮点数,因此我正在使用

        var reqs = new BatchUpdateSpreadsheetRequest();
        reqs.Requests = new List<Request>();
        string[] colNames = new [] { "timestamp", "videoid", "videoname", "firstname", "lastname", "email" };

        // Create starting coordinate where data would be written to

        GridCoordinate gc = new GridCoordinate();
        gc.ColumnIndex = 0;
        gc.RowIndex = 0;
        gc.SheetId = SHEETID; // Your specific sheet ID here

        rq = new Request();
        rq.UpdateCells = new UpdateCellsRequest();
        rq.UpdateCells.Start = gc;
        rq.UpdateCells.Fields = "*"; // needed by API, throws error if null

        // Assigning data to cells
        RowData rd = new RowData();
        List<CellData> lcd = new List<CellData>();
        foreach (String column in colNames)
        {
            ExtendedValue ev = new ExtendedValue();
            ev.StringValue = column;

            CellData cd = new CellData();
            cd.UserEnteredValue = ev;
            lcd.Add(cd);
        }
        rd.Values = lcd;

        // Put cell data into a row
        List<RowData> lrd = new List<RowData>();
        lrd.Add(rd);
        rq.UpdateCells.Rows = lrd;

        // It's a batch request so you can create more than one request and send them all in one batch. Just use reqs.Requests.Add() to add additional requests for the same spreadsheet
        reqs.Requests.Add(rq);

        // Execute request
        response = sheetsService.Spreadsheets.BatchUpdate(reqs, Spreadsheet.SpreadsheetId).Execute(); // Replace Spreadsheet.SpreadsheetId with your recently created spreadsheet ID

这在我的系统上工作正常,但是当在Windows下的MinGW上构建时,会发出警告:

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

我编写了针对此案例的解决方法,但无法检测何时应该使用该解决方法 - 我尝试unknown conversion type character 'a' in format ,但似乎Gcc / MinGW定义即使它不支持{{1 }}。还有我可以检查的另一个宏吗?

2 个答案:

答案 0 :(得分:3)

这不回答“如何检测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相同的数字,具有更高的精度和二进制点的不同位置,它也是正确的。

答案 1 :(得分:2)

正如jxh已经怀疑的那样,MingW使用Windows中的MSVCRT LibC。 C99支持不完整,尤其缺少printf(3) a之类的一些选项。