在mingw环境中对64位字符串格式化程序发出警告

时间:2018-09-06 10:25:20

标签: c scanf mingw-w64

最新版本的mingw-w64上避免对64位printf / scanf参数发出警告的正确方法是什么?

我知道mingw-w64的许多标准库功能都依赖于Microsoft运行时,并且这些功能与C99标准不兼容。

旧答案说要使用%I64d ,但是由于C99标准是%lld ,无论如何,如果我使用 -Wall -pedantic 进行编译我收到 BOTH 语法的警告,这是一个小例子:

#include <stdio.h>

int main(void)
{
    long long test;
    scanf("%I64d", &test);
    scanf("%lld", &test);
}

用gcc编译(我的版本是mingw-w64 5.0.4,gcc 8.2.0):

x86_64-w64-mingw32-gcc -o test.exe test.c -Wall -pedantic

它给出以下警告:

dev:tmp dev$ x86_64-w64-mingw32-gcc -o test.exe test.c -Wall -pedantic
test.c: In function ‘main’:
test.c:6:11: warning: ISO C does not support the ‘I64’ ms_scanf length modifier [-Wformat=]
     scanf("%I64d", &test);
           ^~~~~~~
test.c:6:11: warning: ISO C does not support the ‘I64’ ms_scanf length modifier [-Wformat=]
test.c:7:14: warning: unknown conversion type character ‘l’ in format [-Wformat=]
     scanf("%lld", &test);
              ^
test.c:7:11: warning: too many arguments for format [-Wformat-extra-args]
     scanf("%lld", &test);
           ^~~~~~
test.c:7:14: warning: unknown conversion type character ‘l’ in format [-Wformat=]
     scanf("%lld", &test);
              ^
test.c:7:11: warning: too many arguments for format [-Wformat-extra-args]
     scanf("%lld", &test);
           ^~~~~~

删除 -Wall 会删除这两个警告,而没有 -pedantic 。我可以在没有警告的情况下进行编译,第6行(%I64d),但第7行(%lld)没有警告。

1 个答案:

答案 0 :(得分:-1)

如果您想编译到Microsoft平台,则对遵循该标准不屑一顾拥抱,扩展(和扑灭)!。删除-pedantic或获得适当的C99 / C11 / C17实现。


C89不支持%lld。如果您碰巧以支持它作为扩展名的库为目标,则需要禁用-Wformat