2013-07-04 3 views
4

я составил следующую программу c с gcc -ansi -pedantic -Wall test.c:совместимый способ разобрать 64 разрядное целое число, используя sscanf с GCC

#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-битного целого числа от/до строки,
, который не генерирует эти предупреждения?

ответ

6

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

+1

Тогда из моего понимания, я должен сделать код при минимальных 'стандартов C99' требованиям, если Мне нужно использовать 64-битные значения? –

+1

@awashburn: Да - C99 был первым, кто предоставил тип, который был гарантирован как минимум 64 бита. –

+1

@awashburn, а с C99 вы получаете правильные макросы для обработки 'uint64_t' в 'printf' и' scanf' бесплатно. Поскольку вы помещаете свой вопрос в gcc, в наши дни нет смысла не использовать C99, если у вас плохо написанный наследственный код. –

 Смежные вопросы

  • Нет связанных вопросов^_^