предупреждение о 64-битном строковом форматере в среде mingw - PullRequest
0 голосов
/ 06 сентября 2018

Как правильно избежать предупреждений о 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).

1 Ответ

0 голосов
/ 06 сентября 2018

Если вы хотите скомпилировать на платформе Microsoft, вы не можете быть педантичным о следовании стандарту. Объять, расширить (и погасить)! Удалить -pedantic или получить правильную реализацию C99 / C11 / C17.


C89 не поддерживает %lld. Похоже, вам нужно отключить -Wformat, если вы нацелены на библиотеку, которая поддерживает его как расширение.

...