Действительно ли это - правильный синтаксис (c код, найденный на Википедию)?

Я просто нашел этот код Википедии.
Ссылка: 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'

7
задан m4design 28 May 2010 в 16:18
поделиться

5 ответов

Да, этот синтаксис правильный (по крайней мере, для C99). Однако, похоже, что ваш компилятор не настроен на его обработку. Просто уберите z, и все будет в порядке. Чтобы быть корректным, убедитесь, что ваши спецификаторы формата printf соответствуют размерам типов. Включение всех предупреждений, которые выдает компилятор, вероятно, поможет вам в этом.

Ваша цитата:

Для печати следует использовать префикс z, поскольку фактический размер может отличаться на каждой архитектуре

относится к тому факту, что size_t (который является типом, возвращаемым оператором sizeof) может отличаться от архитектуры к архитектуре. Оператор z предназначен для того, чтобы сделать ваш код более переносимым. Однако, если ваш компилятор не поддерживает его, это не сработает. Просто возитесь с комбинациями %u, %lu и т.д., пока не добьетесь осмысленного вывода.

7
ответ дан 6 December 2019 в 12:46
поделиться

Вы сказали своему компилятору, что хотите, чтобы он думал мозгом 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.

1
ответ дан 6 December 2019 в 12:46
поделиться

Я провел тест с использованием gcc 4.0. Он работает с -std = c99

0
ответ дан 6 December 2019 в 12:46
поделиться

Да, но работает только на C99 -совместимых компиляторах. Из википедии :

z: для целочисленных типов заставляет printf ожидать целочисленный аргумент размера size_t.

2
ответ дан 6 December 2019 в 12:46
поделиться

Модификатор длины z был добавлен к C в стандарте C99; у вас может быть компилятор, не поддерживающий C99 .

Если ваш компилятор C не поддерживает это, вы, вероятно, можете рассматривать размеры как беззнаковые длинные:

printf("%lu,%lu", (unsigned long)sizeof c, (unsigned long)sizeof(int));
6
ответ дан 6 December 2019 в 12:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: