Компилятор GCC ARM C не соблюдает -std = c99 для кода форматирования% llx printf

Я пытаюсь напечатать некоторые 64-битные целые числа без знака, используя что-то вроде этого:

uint64_t x = 0xFFFFFFFFFFFFFFFF;
printf("Value: %016llx \n", x); 

и получаю в ответ:

0000000000000000lx

Если я изменю строку форматирования на% 016lx, я получаю предупреждение компиляции об использовании неправильного типа, и он печатает только младшие 32 бита:

00000000FFFFFFFF

У меня в параметрах компилятора есть строка -std = c99, которая должна обеспечивать выполнение параметра ll, верно?

Для справки, это компилятор arm-none-eabi-gcc (v4.7.3), который поставляется с последней версией Simplicity Studio IDE от Silicon Labs.


person Mouser Williams    schedule 02.10.2014    source источник
comment
Какая у вас библиотека C?   -  person mafso    schedule 02.10.2014
comment
Это не характеристика компилятора, это проблема вашей библиотеки C. Исправить или использовать другой?   -  person Carl Norum    schedule 02.10.2014
comment
Вы ведь включили stdio.h, верно?   -  person nneonneo    schedule 02.10.2014
comment
Да, stdio.h включен (вместе с ctype.h).   -  person Mouser Williams    schedule 03.10.2014


Ответы (1)


Вы пробовали это?

#include <stdio.h>
#include <inttypes.h>

int
main(void)
{
    uint64_t n = 0x123456789;

    printf("n = %#" PRIx64 "\n", n);

    return (0);
}

Реализация printf или scanf зависит от используемой вами библиотеки и может не поддерживать long long. Пожалуйста, проверьте это, напечатав значение PRIx64 - я думаю, в вашем случае это будет «lx» вместо «llx».

Вставка части inttype.h инструментальной цепочки ARM gcc-arm-embedded

/* 64-bit types */
#if __have_long64
#define __PRI64(x) __STRINGIFY(l##x)
#define __SCN64(x) __STRINGIFY(l##x)
#elif __have_longlong64
#define __PRI64(x) __STRINGIFY(ll##x)
#define __SCN64(x) __STRINGIFY(ll##x)
#else
#define __PRI64(x) __STRINGIFY(x)
#define __SCN64(x) __STRINGIFY(x)
#endif
...
#define PRIx64          __PRI64(x)
#define PRIX64          __PRI64(X)
person soerium    schedule 02.10.2014
comment
+1, но не могли бы вы добавить какие-нибудь пояснения? Это было бы отличным ответом :) - person Jens Gustedt; 02.10.2014
comment
Библиотека C, которая не поддерживает %llx, вряд ли будет иметь PRIx64 - по-видимому, это должно быть быть llx. - person Carl Norum; 02.10.2014
comment
Да, библиотека не знает, что делать с PRIx64: error: expected ')' before 'PRIx64' - person Mouser Williams; 03.10.2014
comment
Ааа, после добавления #include <inttypes.h> он компилируется и дает мне n = lx - person Mouser Williams; 03.10.2014
comment
Основываясь на этом выводе, я бы предположил, что я не могу печатать длинные длинные строки, используя текущую библиотеку C, которая у меня есть, хотя эта строка в inttypes.h сбивает меня с толку: #define __PRI64(x) __STRINGIFY(ll##x) - person Mouser Williams; 03.10.2014
comment
Обратите внимание, что long long int и long int - это не один и тот же тип, но они имеют одинаковый размер. - person soerium; 04.10.2014