Как правильно избежать предупреждений о 64-битных аргументах printf / scanf в самых последних версиях mingw-w64?
Я знаю, что mingw-w64 использует среду выполнения Microsoft для многих стандартных функций библиотеки и что эти функции несовместимы со стандартом C99.
Старые ответы говорят, что нужно использовать % I64d , но поскольку стандарт C99 равен % lld , в любом случае, если я скомпилирую с -Wall -pedantic , я получу предупреждение для синтаксиса ОБА , вот небольшой пример:
#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);
^~~~~~
Remove -Wall удаляет оба предупреждения, без -pedantic Я могу скомпилировать без предупреждения строку 6 (% I64d), но не строку 7 (% lld).