Совместимый способ разбора 64-битного целого числа с использованием sscanf с GCC

Я собрал следующее c программа с gcc -ansi -pedantic -Wall test.c:

#include <stdio.h>
#include <stdint.h>
#define  BUFFER 21
int main(int argc, char* argv[]) {
  uint64_t num = 0x1337C0DE;
  char str[BUFFER]; /* Safely Holds UINT64_MAX */
  if(argc > 1)
    sscanf(argv[1],"%llu",&num);
  sprintf(str,"%llu",num);
  return 0;
}

И я получаю следующие предупреждения:

test.c:8:5: warning: ISO C90 does not support the ‘ll’ gnu_scanf length modifier
test.c:9:3: warning: ISO C90 does not support the ‘ll’ gnu_printf length modifier

Что правильно, C90 соответствует стандартам, способ разбирать / выводить 64-битное целое число из / в строку,
который не генерирует эти предупреждения?

2 ответа

Решение

Здесь ничего нет. Самый большой целочисленный тип в C 90 long, который гарантированно будет не менее 32 бит. Поскольку нет целочисленного типа, который гарантированно должен быть не менее 64 бит, также нет способа прочитать 64-битное целое число в C90. Конечно, long может быть 64 бит (это было по крайней мере в одной реализации, но нет уверенности, что это так.

вы можете использовать макросы SCNu64а также PRIu64в <inttypes.h>, например, они могут быть

      sscanf(argv[1],"%" SCNu64,&num);
      sprintf(str,"%" PRIu64,num);
Другие вопросы по тегам