Это правильный синтаксис (код c найден в Википедии)? - PullRequest
7 голосов
/ 28 мая 2010

Я только что нашел этот код в Википедии.
Ссылка: 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, поскольку фактический размер может отличаться для каждой архитектуры».

Я попробовал это на моем компиляторе, но он дает следующий результат:

цы, ца '

Ответы [ 5 ]

7 голосов
/ 28 мая 2010

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

Ваша цитата:

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

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

6 голосов
/ 28 мая 2010

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

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

printf("%lu,%lu", (unsigned long)sizeof c, (unsigned long)sizeof(int));
2 голосов
/ 28 мая 2010

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

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

1 голос
/ 28 мая 2010

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

0 голосов
/ 28 мая 2010

Я сделал тест, используя gcc 4.0. Работает с -std=c99

...