C printf спецификатор% lld печатает символы "ld" - PullRequest
1 голос
/ 04 октября 2019

Я занимаюсь разработкой с использованием gcc (-std = gnu99) для встроенного набора инструментов (Myriota), и у меня проблемы с printf.

при попытке ввода следующего кода:

long long int time = TimeGet();
printf("\nSeconds since epoch: %lld\r\n", time);

он печатает:

Seconds since epoch: ld

При использовании "%" PRId64 печатается тот же "ld".

Есть идеи? Буду признателен, если вы укажете мне правильное место.

Редактировать Исправлен тип переменной long long int time

Ответы [ 2 ]

4 голосов
/ 04 октября 2019

Скорее всего, ваша библиотека C, в частности ее реализация printf, не поддерживает C99.

Тип long long int и формат %lld были введены стандартом ISO C 1999 года (C99). Использование gcc -std=c99 заставляет компилятор пытаться соответствовать C99, но не может заставить библиотеку времени выполнения делать вещи, которые она не реализует. У вас есть несоответствие между тем, что поддерживает компилятор, и тем, что поддерживает библиотека времени выполнения.

В C90 вызов printf с %lld в строке формата имел неопределенное поведение.

Имеет %ld работать для аргумента типа long int? Если аргумент не превышает LONG_MAX, преобразование и использование %ld может быть хорошим обходным путем. Если вам нужно напечатать значения, которые превышают LONG_MAX, реализация преобразования long long int в строку не будет ужасно сложной.

0 голосов
/ 06 октября 2019

Myriota SDK использует newlib-nano, который не поддерживает int64_t. Мне придется реализовать свою собственную функцию для преобразования в строку символов или преобразования в uint32_t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...