Я просто нашел этот код Википедии.
Ссылка: http://en.wikipedia.org/wiki/Sizeof#Use
Код:
/* the following code illustrates the use of sizeof
* with variables and expressions (no parentheses needed),
* and with type names (parentheses needed)
*/
char c;
printf("%zu,%zu", sizeof c, sizeof(int));
Это указывает что: "Z префикс должен использоваться для печати его, потому что фактический размер может разойтись в каждой архитектуре".
Я попробовал его на своем компиляторе, но это дает следующий результат:
'zu, zu'
Да, этот синтаксис правильный (по крайней мере, для C99). Однако, похоже, что ваш компилятор не настроен на его обработку. Просто уберите z
, и все будет в порядке. Чтобы быть корректным, убедитесь, что ваши спецификаторы формата printf
соответствуют размерам типов. Включение всех предупреждений, которые выдает компилятор, вероятно, поможет вам в этом.
Ваша цитата:
Для печати следует использовать префикс z, поскольку фактический размер может отличаться на каждой архитектуре
относится к тому факту, что size_t
(который является типом, возвращаемым оператором sizeof
) может отличаться от архитектуры к архитектуре. Оператор z
предназначен для того, чтобы сделать ваш код более переносимым. Однако, если ваш компилятор не поддерживает его, это не сработает. Просто возитесь с комбинациями %u
, %lu
и т.д., пока не добьетесь осмысленного вывода.
Вы сказали своему компилятору, что хотите, чтобы он думал мозгом C99? Вероятно, для этого есть переключатель. Например, -std = c99
для gcc.
Если ваш компилятор не поддерживает это, но вы знаете, что другие поддержат, вы можете обойти стиль PRId64
(отказ от ответственности - PSEUDO CODE AHEAD ..):
#ifdef __SOME_KNOWN_C99_COMPILER
#define PORTUNSIGNED "zu"
#else
#define PORTUNSIGNED "u"
#endif
printf("%-11" PORTUNSIGNED " ways to skin a cat\n");
Вероятно, лучше получить Однако компилятор, который имеет функциональную поддержку c99.
Я провел тест с использованием gcc 4.0. Он работает с -std = c99
Да, но работает только на C99 -совместимых компиляторах. Из википедии :
z: для целочисленных типов заставляет printf ожидать целочисленный аргумент размера size_t.
Модификатор длины z
был добавлен к C в стандарте C99; у вас может быть компилятор, не поддерживающий C99 .
Если ваш компилятор C не поддерживает это, вы, вероятно, можете рассматривать размеры как беззнаковые длинные:
printf("%lu,%lu", (unsigned long)sizeof c, (unsigned long)sizeof(int));