2016-12-21 4 views
3

Мы используем C89 на встроенной платформе. Я попытался распечатать size_t, но это не сработало:Требуется ли спецификатор% zu для printf?

#include <stdio.h> 
int main(void) { 
    size_t n = 123; 
    printf("%zu\n",n); 
    return 0; 
} 

Вместо 123, я получил zu.
Другие спецификаторы работают правильно.

Если size_t не существует zu также может быть доступен в printf?
Является ли это чем-то, что я должен связаться с продавцом библиотеки, или это реализация библиотеки позволяет исключить его?

+5

Параметр 'z' префикс добавлено в C99, я считаю. –

+0

@KerrekSB Хорошо. Кажется, это не аннотация. http://en.cppreference.com/w/cpp/io/c/fprintf –

+0

Почему в C++-ссылке говорится о стандарте C? – mch

ответ

6

Если size_t существует, не должно быть zu также доступно в printf?

size_t существует по крайней мере с C89, но соответствующий спецификатор формата %zu (в частности, длина модификатора z) был добавлен к стандарту только с C99.

Так что, если вы не можете использовать C99 (или C11) и должны были напечатать size_t в C89, вы просто должны Откат к другим существующим типам, например:

printf("%lu\n", (unsigned long)n); 
+0

Обратите внимание, что приведенный выше код был бы достаточным, хотя и не обязательно эффективным, на любой платформе, где 'unsigned long' был достаточно большим, чтобы разместить максимально возможное значение' n' (независимо от того, было ли оно достаточно большим для обработки всего диапазона 'size_t'). Однако нет никакой гарантии, что 'size_t' не будет больше, чем' unsigned long', и не может быть никакой гарантии, что 'n' всегда будет соответствовать' unsigned long'. Я не знаю, как часто это может быть проблемой [многие программы могут столкнуться с разной проблемой, если они вычисляют размер буферов sprintf ... – supercat

+0

... основанный на предположении, что максимальная длина десятичной длины без знака составляет 10 цифр, а значение для вывода заканчивается дольше, чем это]. – supercat

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